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

我试图以不同的方式从C#调用函数,但始终遇到AccessViolationException:“试图读取或写入 protected 内存。这通常表明其他内存已损坏。”

C++ dll:

extern "C" _declspec (dllexport) int convertVirtualKeyToWChar(int virtualKey, PWCHAR outputChar, PWCHAR deadChar);

C#代码1:
[DllImport("keylib.dll")]
static extern int convertVirtualKeyToWChar(int virtualKey,
               StringBuilder output,
               StringBuilder deadchar);

C#代码2:
static extern int convertVirtualKeyToWChar(int virtualKey,
           out char output,
           ref char deadchar);

最佳答案

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

您要使用以下内容:



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

参见DllImportAttribute.CallingConventionDllImportAttribute.CharSet

关于c# - 如何从C#将PWCHAR传递到C++ dll,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5526570/

10-11 18:08