c++,用字符串 reference/pointer 调用 dll 函数
c++, Call dll function with string reference/pointer
我有一个包含两个项目的解决方案,一个 DLL 和一个控制台应用程序。 console app是调用和测试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 函数应该 return -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 no suitable constructor exists to convert from "std::string *" to "std::basic_string, std::allocator>"
还有:
C2664 'U32 (std::string)': cannot convert argument 1 from 'std::string *' to 'std::string'
如果我不输入 &
,我会得到一个运行时异常:
Exception thrown at 0x0FA65A72 (plugin.dll) in ConsoleApp.exe: 0xC0000005: Access violation writing location 0xCCCCCC00.
GetGreeting 的 typedef 错误,缺少 *
我有一个包含两个项目的解决方案,一个 DLL 和一个控制台应用程序。 console app是调用和测试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 函数应该 return -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 no suitable constructor exists to convert from "std::string *" to "std::basic_string, std::allocator>"
还有:
C2664 'U32 (std::string)': cannot convert argument 1 from 'std::string *' to 'std::string'
如果我不输入 &
,我会得到一个运行时异常:
Exception thrown at 0x0FA65A72 (plugin.dll) in ConsoleApp.exe: 0xC0000005: Access violation writing location 0xCCCCCC00.
GetGreeting 的 typedef 错误,缺少 *