不同进程和体系结构之间的数据类型-编写正确的DllImport



我有一个用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);

最新更新