从DLL文件调用messagebox函数时出现奇怪的字符?

时间:2016-05-21 14:29:43

标签: c# c++ .net dll

我在使用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()来第一次真正显示?感谢。

1 个答案:

答案 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;
}