【发布时间】:2011-06-07 19:26:51
【问题描述】:
我想将我的 C# 字符串发送到 C++ DLL 函数。我已经成功了,都使用了 StringBuilder:
[C#]
public static extern int installHook(StringBuilder directory);
StringBuilder myText = new StringBuilder(512);
myfunc(myText);
[C++]
int OPENGLHOOK_API myfunc(char* directory)
{
::MessageBoxA(NULL,directory,"test123",0);
}
还有一个简单的字符串 & wchar:
[C#]
public static extern int installHook(string directory);
myfunc("myText");
[C++]
int OPENGLHOOK_API installHook(wchar* directory)
{
wstring s = directory;
const wchar_t* wstr = s.c_str();
size_t wlen = wcslen(wstr) + 1;
char newchar[100];
size_t convertedChars = 0;
wcstombs_s(&convertedChars, newchar, wlen, wstr, _TRUNCATE);
::MessageBoxA(NULL,newchar,"test123",0);
}
正如 StackOverflow 上的其他线程中提到的那样。问题是每次我这样做,我都会得到一个错误,因为函数签名不一样:
托管调试助手“PInvokeStackImbalance”在“C:\Users\Dave\Documents\Visual Studio 2010\Projects\OpenGLInjector\Loader\bin\Release\Loader.vshost.exe”中检测到问题。 附加信息:对 PInvoke 函数 'Loader!Loader.Form1::myfunc' 的调用使堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。
知道如何解决我的问题/从这里做什么?
【问题讨论】:
-
OPENGLHOOK_API扩展为什么? -
简单的 __declspec(dllexport) 定义
-
我希望它是.. 我可以关闭 MDA,但这并不能解决我的问题,不是吗?
-
@David :这意味着你的函数被导出为
__cdecl,但.NET P/Invoke 默认需要__stdcall。您需要协调这些。