从DLL文件调用消息框函数时出现奇怪的字符



从 dll 文件调用函数时看到一个问题,该文件在 C++ 中编译,dll 文件中的函数代码如下:

#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;
}

在此,我导出两个函数inputt()和Shooow()。名为"TestCCCC.dll"的 dll 文件。然后我在 C# 代码中调用它们,如下所示:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Runtime.InteropServices;
namespace muWrapper
{
    public partial class WndSample : Form
    {
        [DllImport("TestCCCC.dll")]
        private static extern int inputt(string FuncName);
        [DllImport("TestCCCC.dll")]
        private static extern int Shooow();
      public WndSample()
      {
        InitializeComponent();
      }
      private void button1_Click(object sender, EventArgs e)
      {
          int ret = inputt("aaaaaa");
          ret = Shooow();
      }
    }
}

当我运行它时,第一次单击按钮,它会显示一个带有奇怪字符的消息框,而不是"aaaaaa"!!?继续点击第二次,它真正显示"aaaaaa",然后继续...并真实地展示。

告诉我这个问题发生了什么?如何编写两个函数inputt()和Shooow()在第一次真正显示?谢谢。

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

相关内容

  • 没有找到相关文章

最新更新