c ++,使用字符串引用/指针调用dll函数

时间:2018-10-24 13:28:13

标签: c++ visual-c++ dll stdstring dllexport

我有一个包含两个项目,一个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。

1 个答案:

答案 0 :(得分:1)

GetGreeting的typedef是错误的,它缺少一个*