在 C++ 和 Visual Studio 中通过 GetProcAddress() 与 DLL 函数接口

m25*_*m25 2 c++ dll

好的伙计们,这是我上一篇文章的扩展,已解决,该部分运行良好(链接如下)

使用 GetProcAddress() C++ VBexpress 13 找不到函数

不幸的是,出现了另一个误解。下面是我将要引用的代码:

#include "stdafx.h"
#include <iostream>
#include "Windows.h"
#include <stdio.h> 

typedef int(__cdecl *MYPROC)(LPWSTR);

using namespace std;

int main()
{

HINSTANCE hinstLib;
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;

hinstLib = LoadLibrary(TEXT("testDLL.dll"));
if (hinstLib != NULL)
{
    ProcAdd = (MYPROC)GetProcAddress(hinstLib, "?Add@MyMathFuncs@MathFuncs@@SANNN@Z");

    // If the function address is valid, call the function.

    if (NULL != ProcAdd)
    {
        fRunTimeLinkSuccess = TRUE;
        c=(ProcAdd)(L"something here");
    }
    fFreeResult = FreeLibrary(hinstLib);
}

return 0;
Run Code Online (Sandbox Code Playgroud)

}

问题:无法与功能接口。程序识别 DLL 和函数。我确信它与 typedef、对 ProcAdd 的分配以及我对函数的实际调用有关。在这个例子中,我调用了一个将双精度加在一起的函数。显然我需要通过 2 个双打。似乎逻辑会决定我可以用'typedef int(__cdecl *MYPROC)(double,double);'替换typedef 或类似的东西,并将 L"something here" 替换为 2 个双打并将其分配给一个值。当我这样做时没有运行时错误,但我只是为返回的数字提供了一个很大的负数。这两条让我感到困惑的行到底发生了什么?不幸的是,我什至不确定要特别做什么。我明白 _cdecl 是什么。

简短的背景:我必须与我没有 .lib 文件的 DLL 交互。我遇到了问题,所以我在http://msdn.microsoft.com/en-us/library/ms235636.aspx 上使用 MS 教程制作了一个 DLL,并使用上面的代码引用了该 DLL,该代码取自另一个 MS 教程如果我没记错的话。

对理解这些基本概念的任何帮助将不胜感激。谢谢你!

thu*_*zas 7

typedef int(__cdecl *MYPROC)(LPWSTR); 正在为函数指针引入一个类型定义,换句话说,它转换为:

“MYPROC 是一个指向一个函数的指针,它接受一个 LPWSTR 并返回一个 int”。所以你的假设是正确的。你的逻辑也是正确的,因为你想做一些事情:

typedef double(__cdecl *MYPROC)(double, double);
   ....
MYPROC pMyFun = (MYPROC)GetProcAddress(hinstLib, "?Add@MyMathFuncs@MathFuncs@@SANNN@Z");
   ....
pMyFun(1.0,2.0);
Run Code Online (Sandbox Code Playgroud)

这样做的目的是在第一行引入一种新类型。然后我们声明一个这种类型的变量,然后为它分配感兴趣的函数的地址,最后,我们使用这个指针调用函数。如果您不熟悉函数指针,本教程可能会有所帮助

鉴于此,我有两个问题:

(1) 你从哪里得到函数的名称?(2) TestDll.dll 是你写的那个dll,还是你需要接口的那个?