gpt4 book ai didi

c++ - 在 C++ 和 Visual Studio 中通过 GetProcAddress() 与 DLL 函数交互

转载 作者:太空狗 更新时间:2023-10-29 20:59:44 28 4
gpt4 key购买 nike

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

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 的分配以及我对该函数的实际调用有关。在这个例子中,我调用了一个将 double 相加的函数。显然我需要通过 2 个 double 。似乎逻辑会指示我可以用“typedef int(__cdecl *MYPROC)(double,double);”替换 typedef或类似的东西并将 L"something here"替换为 2 个 double 并将其分配给一个值。当我这样做时没有运行时错误,但我只是为返回的数字提供了一个大的负数。抛出我的这两条线到底发生了什么?不幸的是,我什至不确定具体要做什么。我明白 _cdecl 是什么。

简短背景:我必须与我没有 .lib 文件的 DLL 进行交互。我遇到了麻烦,所以我用 http://msdn.microsoft.com/en-us/library/ms235636.aspx 的 MS 教程制作了一个 DLL。并使用上面的代码引用该 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);

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

鉴于此,我有两个问题:

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

关于c++ - 在 C++ 和 Visual Studio 中通过 GetProcAddress() 与 DLL 函数交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23965663/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com