在CPP中创建和使用DLL

时间:2014-06-02 14:19:56

标签: c++ dll

我正在开发一个项目,我正在创建一个小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);

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

1 个答案:

答案 0 :(得分:3)

如果您提供的姓名GetProcAddress完全匹配您正在呼叫的功能的名称,则

GetProcAddress会失败。通过 exact 我的意思是一切 - 构成函数名称的字符,函数名称必须与大小写匹配等。

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

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

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

的应用程序
  1. 使用与DLL相同版本的Visual C ++进行编译
  2. 构建应用程序和DLL时使用相同的编译器选项
  3. 所有组件(DLL和app)必须使用C运行时库的DLL版本。
  4. 否则,您的代码将具有未定义的行为,即使您已正确检索函数指针,也可能会崩溃。