我有一个c#程序,用于检查c ++ dll中的数据库字符串。
我已经读过这个页面了:
我的字符串传递良好而没有错误,但我的问题是它们在C ++ dll中不匹配。
我尝试使用Messagebox,Console和Everything检查它们,它们在字符,大小,文本方面是相同的......
但如果其他总是返回false ...
我的C ++代码(test_match.dll):
extern "C" __declspec(dllexport) int check_string(const char* string_from_csharp);
int check_string(const char* string_from_csharp)
{
if (string_from_csharp == "hello world!" ){
return 1;
}else{
return 0;
}
}
我的C#代码:
[DllImport("test_match.dll",
CallingConvention = CallingConvention.Cdecl ,
CharSet = CharSet.Unicode)]
private static extern int check_string(string string_from_csharp)
我的C#使用代码(WPF):
int get_match_state = check_string(inputtext.Text);
C ++中的MessageBox,说...输入是"你好世界!"
但它总是返回0
另外,我尝试将它们转换为wchar_t,std :: string with find()但没有改变。
我在哪里犯错? 感谢
答案 0 :(得分:2)
你不能比较那样的字符串:
if (string_from_csharp == "hello world!" )
如果您绝对需要使用char *,请使用strcmp或strncmp。
extern "C" __declspec(dllexport) int check_string(const char* string_from_csharp);
bool check_string(const char* string_from_csharp)
{
return (strcmp(string_from_csharp, "hello world!") == 0);
}
您可能希望使用std::string
,因为您使用的是C ++。在这种情况下,您可以使用std::string::compare。
答案 1 :(得分:0)
正如tkausl和Daisy在评论中提到的我相信C ++,你正在比较指针值而不是实际的字符串值。在您的情况下,我认为进行比较的最简单方法是使用strcmp来比较2个字符串。
答案 2 :(得分:0)
正确答案属于MartinVéronneau和Hans Passant(@ hans-passant @ martin-véronneau)
CharSet.Unicode错误,你需要CharSet.Ansi来匹配一个char * 论点。并且您需要在C语言中正确地比较字符串 你使用strcmp()。至少CharSet不匹配应该很容易 要使用调试器进行发现,请确保您知道如何调试本机代码 当从C#转发时。 - 汉斯帕斯特
谢谢汉斯和马丁!
问题是CharSet = CharSet.Unicode
,我改为CharSet = CharSet.Ansi
,现在一切正常!