如何从C#将PWCHAR传递给C++ DLL

ija*_*vid 2 c# c++ dll pinvoke dllimport

我有一个用C++编写的dll,我想用C#调用它.函数输出outputChar和deadChar,deadChar变量也由C++函数读取.

我试图以不同的方式从C#调用函数,但是我一直得到AccessViolationException:"试图读取或写入受保护的内存.这通常表明其他内存已损坏."

C++ DLL:

extern "C" _declspec (dllexport) int convertVirtualKeyToWChar(int virtualKey, PWCHAR outputChar, PWCHAR deadChar);
Run Code Online (Sandbox Code Playgroud)

C#代码1:

[DllImport("keylib.dll")]
static extern int convertVirtualKeyToWChar(int virtualKey,
               StringBuilder output,
               StringBuilder deadchar);
Run Code Online (Sandbox Code Playgroud)

C#代码2:

static extern int convertVirtualKeyToWChar(int virtualKey,
           out char output,
           ref char deadchar);
Run Code Online (Sandbox Code Playgroud)

Lee*_*ger 5

注意:PWCHAR函数 的两个参数convertVirtualKeyToWChar是不明确的.它们可以指向单个WCHAR指针或指向WCHAR字符串的指针.给定函数和参数的名称,这个答案假定它们是指向单个的指针WCHAR.

您想要使用以下内容:

[DllImport("keylib.dll", CharSet=CharSet.Unicode, CallingConvention=CallingConvention.Cdecl)]
static extern int convertVirtualKeyToWChar( int virtualKey,
       out char output,
       ref char deadchar );
Run Code Online (Sandbox Code Playgroud)

崩溃的原因有两个: DllImport默认为ANSI字符集和StdCall调用约定.您的C++ DLL没有指定任何调用约定,因此它将默认为CDecl.

请参阅DllImportAttribute.CallingConventionDllImportAttribute.CharSet