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