我在使用C ++编译的dll文件中调用函数时遇到问题,带有函数代码的dll文件如下:
...
success: function() {
$("#msg_age").fadeIn().delay(4000).fadeOut();
}
在此,我导出两个函数inputt()和Shooow()。 Dll文件名为" TestCCCC.dll"。然后我用C#代码调用它们如下:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <string.h>
char* str;
int _stdcall inputt(char* str_)
{
str=str_;
return 1;
}
int _stdcall Shooow()
{
MessageBoxA(NULL,str,"Message...",MB_OK);
return 0;
}
当我运行它时,第一次单击按钮,它会显示一个带有奇怪字符的消息框,而不是&#34; aaaaaa&#34; !?第二次继续点击,它真实地显示了&#34; aaaaaa&#34;,并继续...并真实地展示......
告诉我这个问题发生了什么?如何编写两个函数inputt()和Shooow()来第一次真正显示?感谢。
答案 0 :(得分:2)
inputt
传递一个指向临时字符串的指针。你不能只保存指针,你需要保存整个字符串的副本。使用std::string
#include "stdafx.h"
#include <windows.h>
#include <string>
static std::string str;
int _stdcall inputt(const char* str_)
{
str=str_;
return 1;
}
int _stdcall Shooow()
{
MessageBoxA(NULL,str.c_str(),"Message...",MB_OK);
return 0;
}
C#本机支持Unicode字符串。如果要处理任意字符串,则需要将DLLImport行更改为:
[DllImport("TestCCCC.dll", CharSet = Unicode)]
private static extern int inputt(string FuncName);
然后将C ++更改为:
#include "stdafx.h"
#include <windows.h>
#include <string>
static std::wstring str; // wide string
int _stdcall inputt(const wchar_t* str_) // wide char pointer.
{
str=str_;
return 1;
}
int _stdcall Shooow()
{
MessageBoxW(NULL,str.c_str(),L"Message...",MB_OK); // Use W version and long title.
return 0;
}