如何处理使用pinvoke从C#调用的dll方法中的可选struct参数?例如,lpSecurityAttributesparameterhere不存在时应传递null。传递struct的正确方法似乎是使用ref,但它不能有可选参数,或者通常采用null.有什么方法可以实现? 最佳答案 你有几个选择1)使用class而不是struct我觉得这个方法最简单。只需声明struct作为class:[StructLayout(LayoutKind.Sequential)]publicclassCStruct{//member-list}然后
我的应用程序启动了另一个外部应用程序。我想在这个外部应用程序启动后删除它的标题栏。这是否可行,如果可行,如何实现?根据评论,我正在使用下面的工作代码//Findsawindowbyclassname[DllImport("USER32.DLL")]publicstaticexternIntPtrFindWindow(stringlpClassName,stringlpWindowName);//Setsawindowtobeachildwindowofanotherwindow[DllImport("USER32.DLL")]publicstaticexternIntPtrSetPar
我想P/Invoke到GetWindowLongPtr和SetWindowLongPtr,而且我看到了关于它们的相互矛盾的信息。一些消息称,在32位平台上,GetWindowLongPtr只是一个调用GetWindowLong的预处理器宏,而GetWindowLongPtr并不作为user32.dll中的入口点存在。例如:pinvoke.netentryforSetWindowLongPtr有一个检查IntPtr.Size的静态方法,然后调用SetWindowLong或SetWindowLongPtr,并附有一条评论说“遗留操作系统不支持SetWindowLongPtr”。没有解释“遗
我希望能够从任务栏中隐藏另一个应用程序的窗口,而不隐藏窗口本身。具体来说,我想要运行多个不同的Web浏览器,这些浏览器在Alt+Tab列表中可见且可用,但不占用任务栏上的空间。(如果有人好奇原因:我编写了一个仪表板应用程序,它使用Vista的DwmRegisterThumbnailAPI来同时显示多个窗口的实时预览——如果您愿意的话,这是一种“画中画”。在这一点上,还有为这些窗口设置任务栏按钮似乎是多余的。)我知道更改其他窗口的样式以包含WS_EX_TOOLWINDOW会将其从任务栏中隐藏,我首先尝试了这个。但是,正如预期的那样,它产生了一些我不想要的副作用:标题栏变短了(我猜并非全是
我有以下C++结构structInnerStruct{intA;intB;};structOuterStruct{intnumberStructs;InnerStruct*innerStructs;};还有一个C++函数OuterStructgetStructs();我如何将其编码到C#?C#定义在哪里structOuterStruct{InnerStruct[]innerStructs;}; 最佳答案 您必须手动执行此操作,因为无法告诉P/Invoke层要从C++返回值中整理多少数据。structOuterStruct{intnu
考虑以下场景:我正在运行我的应用程序,该应用程序在执行期间必须运行另一个进程,并且只有在第二个进程完成内部特定初始化之后,我的第一个进程才能继续。例如:...//Process1codedoesvariousinitializationshereProcess.Start("Process2.exe");//WaituntilProcess2finishesitsinitializationandonlythencontinue(Process2doesn'texit)...我看到几个选项:Mutex-在考虑进程间通信时会自动想到Mutex,但是,我看不出有什么方法可以让Process
首先我要说的是,我在整个论坛和网络上的许多链接中查看并找到了有关使用fixed{}、Marshal.AllocHGlobal()和GCHandle.Alloc()的描述。但是,我还没有找到关于何时使用Marshal类与GCHandle类(使用和不使用fixed{})的简明解释。我正在使用第三方.NET库,它在“Buffer”类中有一个名为Readline()的方法。手册显示了以下函数原型(prototype):boolReadLine(intx1,inty1,intx2,inty2,System.IntPtrbufData,outintnumRead);bufData的描述如下:...
对于接下来冗长的介绍,我们深表歉意。我需要比我更了解P/Invoke内部结构的人的见解。以下是我如何将包含函数指针的结构从C编码到C#。我想知道这是否是最干净和/或最有效的方式。我正在与一个用C编码的nativeDLL交互,它提供以下入口点:void*getInterface(intid);您必须传递getInterface(int)以下枚举值之一:enumINTERFACES{FOO,BAR};它返回一个指向包含函数指针的结构的指针,例如:typedefstructIFOO{void(*method1)(void*self,inta,floatb);void(*method2)(vo
我有一个unsafebyte*指向已知长度的native字节数组。如何将其转换为byte[]?指向零终止native字符串的unsafesbyte*可以很容易地转换为C#string,因为有一个conversionconstructor为此目的,但我找不到将byte*转换为byte[]的简单方法。 最佳答案 如果ptr是您的不安全指针,并且数组的长度为len,您可以像这样使用Marshal.Copy:byte[]arr=newbyte[len];Marshal.Copy((IntPtr)ptr,arr,0,len);但我确实想知道您
我在网上广泛搜索,但没有找到很好的解释。我的问题很简单。我有一个DLL,它有一个名为Initialize的函数,其中一个参数是一个指针,它将接收一个句柄以供后续调用使用。另一个参数是一个字符串,为了完整起见,我将列出它。我使用的签名是(以其简单的形式):[DllImport(MyDll)]staticexternboolInitialize([In]stringname,outIntPtrhandle);DLL本身中的签名写为:Initialize(LPTSTRname,HANDLEhandle)带有注释“HANDLE:指向将接收句柄的位置的指针”。而后续调用的形式是[DllImpor