不同进程和体系结构之间的数据类型-编写正确的DllImport
本文关键字:DllImport 数据类型 进程 体系结构 之间 | 更新日期: 2023-09-27 18:08:03
我有一个用c#编写的主应用程序,作为x64位应用程序运行,它通过dll导入与标准的本机非托管C/c++ dll进行通信,我也有它的头。
我需要帮助设置正确的数据类型。
所以我公开了一个我必须调用的方法和在dll头文件中定义的数据类型。
typedef int DLL_IMP_EXP (* INJECTDLL)(HANDLE, DWORD, LPCTSTR, DWORD, HINSTANCE *);
定义为 void *
DWORD定义为unsigned long
LPCTSTR定义为__nullterminated CONST CHAR*
HINSTANCE给了我这行定义:DECLARE_HANDLE(HINSTANCE); ?!?
使用Unicode声明函数:LPCWSTR定义为__nullterminated CONST WCHAR*
请帮我写正确的声明:
[DllImport ("Inject.dll", VariousParameters)]
public static extern int InjectDll(CorrectDataTypes);
编译 variouparameters 如果需要,显然CorrectDataTypes。
IntPtr用于指针或句柄——在32位系统上是32位,在64位系统上是64位。如果你有任何东西是一个原始指针或句柄使用IntPtr它会在两个系统上正确工作。然而,你的最后一个参数是一个指向句柄的指针-使用ref来处理指针。所以在这个例子中,因为它是一个指向句柄的指针,所以形参将是一个指向IntPtr类型的ref。
对于标准数字类型,这些将直接映射到。net数据类型-您可以在MSDN上获得更多详细信息。
空终止字符串被正确处理,尽管您需要指定它是使用ANSI还是Unicode字符串。
最后p/Invoke假设一个StdCall调用约定(这是Windows API使用的)。如果你不使用它,函数原型会在其中包含STDCALL或__stdcall,标准的C调用约定是Cdecl。尽管您必须找出DLL_IMP_EXP展开成什么
所以你的p/Invoke声明应该是:[DllImport ("Inject.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern int InjectDll(IntPtr handle, uint dword, string str, uint dword2, ref IntPtr hInstance);