【问题标题】:Not finding function using GetProcAddress() C++ VBexpress 13使用 GetProcAddress() C++ VBexpress 13 找不到函数
【发布时间】:2014-05-21 19:20:14
【问题描述】:

好的,所以我在这里危险地接近重新发布,但我的情况与有关此功能的许多其他海报有点不同。我正在与过去编写的 DLL 进行交互,而我所拥有的只是文件。我没有 .lib 文件,所以我使用的是 LoadLibrary 和 GetProcessAddress 函数。我按照 MSDN 网站上的教程获得了基本结构。 DLL 位于项目文件夹中。它编译。在运行时,我得到了“hinstLib”的数值,所以我假设找到了 DLL。我得到“ProcAdd”变量的空值。其他海报通过将 extern C 放入 DLL 函数中解决了问题,但我真的没有这个选项。更不用说,据我所知,这个 DLL 是用纯 C 编写的。我确实有一个接口文档,并且很确定我的函数名称是正确的(为此目的,用一个通用示例替换)。老实说,我没有通过 ProcAdd 分配运行任何东西,因为它出现了 NULL。任何关于为什么这给我的函数分配值为 0 的想法将不胜感激。注意:很遗憾由于各种原因我无法上传 DLL。

    #include <iostream>
    #include "stdafx.h"
    #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("dllName.dll"));
      if (hinstLib != NULL) 
    { 
    ProcAdd = (MYPROC) GetProcAddress(hinstLib, "funcName"); 

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

    if (NULL != ProcAdd) 
    {
        fRunTimeLinkSuccess = TRUE;
        //(ProcAdd) (L"Message sent to the DLL function\n"); 
    }
    // Free the DLL module.

    fFreeResult = FreeLibrary(hinstLib); 
} 

// If unable to call the DLL function, use an alternative.
if (! fRunTimeLinkSuccess) 
    printf("Message printed from executable\n"); 

return 0;

}

【问题讨论】:

  • 你的问题是函数名,你在上面的代码中巧妙地用一个虚构的东西替换了它。
  • 旁注:#include "stdafx.h" 应该出现在所有其他 #include 语句 IIRC 之前。
  • 这就是我所害怕的……看来我自己一个人。谢谢大家的帮助。
  • 你不是靠自己,但你不是在帮助那些可以帮助你的人,而是在他们的路上设置障碍。 :( 现在,尝试dumpbin /exports blahblah.dll 并检查函数的名称。顺便说一句,你的代码有两个问题。你有一个预编译头不是第一个,这意味着它被忽略之前的所有内容。第二,你是使用 Microsoft TEXT 宏在 2000 年前与 Windows 9x 的 DLL 中的 MFC 兼容(呸),这是不现实的。您可以放弃所有 T 的东西。
  • 哇,这是一个很棒的工具。我在 DLL 上运行它,我的接口文档中的文件名不够具体。现在可以了。现在作为后续问题......我再次做了完全相同的事情,命令提示符给了我“无效文件格式;忽略”的错误。我必须关闭 DLL 还是什么?

标签: c++ dll loadlibrary getprocaddress


【解决方案1】:

编译器通常会修改函数名称,然后一个名为 funcName 的函数可能会出现在 DLL 中,名称为 funcName@16 ,例如...这取决于调用约定,并且对于正确调用函数很重要。对于__cdecl 调用约定,您可能需要_funcName :-)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    相关资源
    最近更新 更多