我有一个包含两个项目,一个DLL和一个控制台应用程序的解决方案。控制台应用程序是用于调用和测试DLL中功能的客户端。
对于第一个功能greetings
,我遇到了一个问题。我应该提到我对C和C ++完全陌生。
DLL项目(称为插件)如下:
plugin.h
#include "types.h" // which contains S32 and #include<string>
#define EXPORT extern "C" __declspec (dllexport)
EXPORT S32 WINAPI _3Greetings(string *str);
plugin.cpp
#include "plugin.h"
S32 __stdcall _3Greetings(string *str)
{
*str = "Hello From Plugin!";
return -1;
}
所有DLL函数在成功时应返回-1
,而在失败时应返回[1-255]
。此外,该项目还有plugin.def
来解决__stdcall
调用约定的名称修饰。
控制台应用程序如下所示:
typedef U32(*GetGreetings)(string);
HMODULE DllHandler = ::LoadLibrary(L"plugin.dll");
if (DllHandler != NULL) {
string greetingText;
GetGreetings greetings = reinterpret_cast<GetGreetings>(GetProcAddress(DllHandler2, "_3Greetings"));
greetings(&greetingText); // THE PROBLEM HERE
cout << greetings << endl;
}
问题是,如果我将&
添加到greetingText
,则会收到错误消息:
E0415没有合适的构造函数,无法从“ std :: string *”转换为“ std :: basic_string,std :: allocator>”
还有:
C2664'U32(std :: string)':无法将参数1从'std :: string *'转换为'std :: string'
如果我不放置&
,则会收到运行时异常:
在ConsoleApp.exe中的0x0FA65A72(plugin.dll)处引发的异常:0xC0000005:访问冲突写入位置0xCCCCCC00。
答案 0 :(得分:1)
GetGreeting的typedef是错误的,它缺少一个*