在 CPP 中创建和使用 DLL

Posted

技术标签:

【中文标题】在 CPP 中创建和使用 DLL【英文标题】:Creating and using a DLL in CPP 【发布时间】:2014-06-02 14:19:56 【问题描述】:

我正在开发一个项目,我正在创建一个小型 DLL,然后还创建一个 Windows 应用程序来使用它。

我不知道发生了什么。

我在 DLL 中有一个名为“startPicadorVisual”的函数,它接受一个参数,即 std::string。

在依赖于 DLL 的应用程序中,我在一个主要是自动生成的 .h 文件中有以下代码:

typedef void (__stdcall *f_startPicadorVisual)(string s);

namespace PicadorPrototype 
    f_startPicadorVisual startPicadorVisual;
    Form1(void) 
    //Load DLL Funcs
    HINSTANCE hGetProcIDDLL = LoadLibrary(L"..\\Debug\\Picador.dll");

    if (!hGetProcIDDLL) 
        std::cout << "could not load the dynamic library" << std::endl;
        throw "Bad Stuff";
    

    startPicadorVisual = (f_startPicadorVisual)GetProcAddress(hGetProcIDDLL, "startPicadorVisual");

    if (!startPicadorVisual) 
        std::cout << "could not locate the function" << std::endl;
        throw "More Bad Stuff";
    

当我调用 GetProcAddress 时第二步失败时。

函数在我的DLL中定义如下:

void __declspec(dllexport) startPicadorVisual(string fixtureNamet);
PicadorResults __declspec(dllexport) getPicadorReading(string fixtureName);

谁能告诉我为什么这不起作用?

【问题讨论】:

我相信这是因为名称错误。 ***.com/questions/1467144/… 使用 DLL 的最简单方法是允许 C 运行时执行加载库和与动态库的链接。当您编译和链接一个 DLL 时,至少应该创建两个东西:(1) .dll 本身和 (2) 一个包含 .dll 存根的 .lib 文件。您可以链接 .lib 文件并将 .dll 文件与可执行文件一起包含在内。链接器将与 .lib 文件中的存根链接,然后处理加载库并将各种存根与 .dll 中的实际函数连接。 谢谢@RichardChambers 我仍然对为什么这段代码不起作用很感兴趣,但你的评论让我再次考虑使用那个系统,而且现在时间不在我身边,我认为最好去做就对了。现在一切正常。 @IvanGrynko 我认为您可能是对的,不幸的是我没有时间回去检查。我认为这是一件好事,这意味着我的项目正在取得进展。 【参考方案1】:

GetProcAddress 如果您给GetProcAddress 提供的名称与您正在调用的函数的名称​​完全 不匹配,则会失败。 确切我的意思是一切——组成函数名的字符,函数名必须匹配大小写,等等。

因此,要么您的 DLL 导出了一个不同的名称而您没有意识到这一点,要么您根本没有导出该名称。

您可以轻松找到导出的 DLL 函数的名称,您可以使用此处找到的 Dependency Walker 程序:http://www.dependencywalker.com/

此外,使用分配动态内存的 C++ 对象(例如 std::string)作为参数也不是一个好主意。如果这样做,您的 DLL 将仅适用于

    使用与 DLL 相同版本的 Visual C++ 编译 在构建应用程序和 DLL 时使用相同的编译器选项 所有组件(DLL 和应用程序)都必须使用 C 运行时库的 DLL 版本。

否则,即使您已正确检索函数指针,您的代码也会有未定义的行为,很可能会崩溃。

【讨论】:

以上是关于在 CPP 中创建和使用 DLL的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MFC 常规 DLL 中创建和使用 CFormView? (视觉工作室 2008)

在C ++中创建和使用动态数组

使用 yaml-cpp 源代码创建 dll

visual studio中新建和使用dll

如何在 Mongoose 中创建和使用枚举

如何在 iOS 的核心数据中创建和使用带有查询的 NSPredicate?