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

时间:2014-05-31 01:50:57

标签: c++ dll

好吧,伙计们这是我上一篇文章的扩展,已经解决,而且这部分工作得很好(链接如下)

Not finding function using 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;

}

问题:在与功能接口方面遇到问题。程序识别DLL和函数。我确定它与typedef,ProcAdd的赋值以及函数的实际调用有关。在这个例子中,我正在调用一个将双精度加在一起的函数。显然我需要传球2次。似乎逻辑会指示我可以用'typedef int(__ cdecl * MYPROC)(double,double)替换typedef;'或类似的东西,用2个双打替换L“这里的东西”,并将其分配给一个值。当我这样做时没有运行时错误,但我只是给返回的数字一个大的负数。在这两条投掷我的线路中究竟发生了什么?我甚至不确定具体到底是什么。我明白_cdecl是什么。

简短的背景:我不得不与我没有.lib文件的DLL接口。我遇到了麻烦,所以我在http://msdn.microsoft.com/en-us/library/ms235636.aspx使用MS教程制作了一个DLL,并使用上面的代码引用该DLL,如果我没记错的话,这是从另一个MS教程中获取的。

非常感谢任何理解这些基本概念的帮助。谢谢!

1 个答案:

答案 0 :(得分:3)

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);

这是做什么,在第一行引入了一种新类型。然后我们声明一个这种类型的变量,然后为它分配感兴趣的函数的地址,最后,我们通过使用这个指针调用该函数。如果您不熟悉函数指针this tutorial may help

鉴于此,我有两个问题:

(1)你在哪里获得该功能的名称? (2)你编写的dll是TestDll.dll,还是你需要连接的那个?

相关问题