【问题标题】:c++, Call dll function with string reference/pointerc++,使用字符串引用/指针调用 dll 函数
【发布时间】:2019-03-28 22:38:18
【问题描述】:

我有一个包含两个项目的解决方案,一个 DLL 和一个控制台应用程序。控制台应用程序是调用和测试 DLL 中的函数的客户端。

对于第一个函数greetings,我遇到了一个问题。我应该提一下,我对 C 和 C++ 完全陌生。

DLL 项目(称为插件)如下所示:

插件.h

#include "types.h" // which contains S32 and #include<string>
#define EXPORT extern "C" __declspec (dllexport)
EXPORT S32 WINAPI _3Greetings(string *str);

插件.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;
        }

问题是如果我将&amp; 添加到greetingText,我得到一个错误:

E0415 不存在合适的构造函数来将“std::string *”转换为“std::basic_string, std::allocator>”

还有:

C2664 'U32 (std::string)': 无法将参数 1 从 'std::string *' 转换为 'std::string'

如果我不输入&amp;,我会得到一个运行时异常:

在 ConsoleApp.exe 中的 0x0FA65A72 (plugin.dll) 处引发异常:0xC0000005:访问冲突写入位置 0xCCCCCC00。

【问题讨论】:

  • 查看应用程序中的类型别名GetGreetings,并将其与DLL 中_3Greetings 的声明进行比较。它们是一样的吗?
  • 如果你想通过引用传递东西,使用引用而不是指针。
  • 非 POD 类型,例如 std::string,不是互操作安全的,根本不应该像这样通过 DLL 边界。即使DLL和EXE是用同一个编译器的同一个版本编译的,还是不安全的。所以不要这样做。永远。

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


【解决方案1】:

GetGreeting 的 typedef 错误,它漏掉了一个 *

【讨论】:

  • 谢谢,我完全忘记了 GetProcAdress 返回指针并与函数参数指针混淆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 2016-10-12
  • 1970-01-01
相关资源
最近更新 更多