在c++和visual studio中通过GetProcAddress()与DLL函数进行接口

interfacing with a DLL function through GetProcAddress() in C++ and visual studio

本文关键字:DLL 函数 接口 GetProcAddress visual c++ studio      更新时间:2023-10-16

好了,伙计们,这是我上一篇文章的扩展,已经解决了,这部分工作得很好

没有找到使用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和函数。我确信它与类型定义、ProcAdd的赋值以及我对函数的实际调用有关。在这个例子中,我正在调用一个函数,将双精度加在一起。显然我需要通过两次双打。似乎逻辑会决定我可以将typedef替换为'typedef int(__cdecl *MYPROC)(double,double);'或类似的东西,并将L"这里的东西"替换为2双精度并将其分配给一个值。当我这样做时,没有运行时错误,但我只是为返回的数字提供了一个大的负数。这两行到底发生了什么?不幸的是,我甚至不知道具体该说什么。我知道_cdecl是什么。

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

如能帮助我理解这些基本概念,我将不胜感激。谢谢你!

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

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

鉴于此,我有两个问题:

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