好的伙计们,这是我上一篇文章的扩展,已解决,该部分运行良好(链接如下)
使用 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 教程如果我没记错的话。
对理解这些基本概念的任何帮助将不胜感激。谢谢你!
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,还是你需要接口的那个?