c++ - 从 C++ 调用 Win32 DLL

标签 c++ winapi dll

我是 DLL 世界的新手。我得到了一个具有很多功能的 Win32 DLL。需要从 C++ 调用这些 DLL 函数

我想调用 CreateNewScanner 创建一个新的扫描器对象并在 C++ 中获取结果。 DLL中提到的函数是:

BOOL CreateNewScanner(NewScanner *newScan);

NewScanner是一个struct,如下,

// Structure NewScanner is defined in "common.h" .
typedef struct{
  BYTE host_no; // <- host_no =0
  LONG time; // <- command timeout (in seconds)
  BYTE status; // -> Host adapter status
  HANDLE obj; // -> Object handle for the scanner
}NewScanner;

我将如何调用这个函数?从 C++ 开始,这就是我管理的内容,

#include <iostream>
#include <windows.h>
using namespace std;
int main(){
  HINSTANCE hInstance;    
  if(!(hInstance=LoadLibrary("WinScanner.dll"))){
      cout << "could not load library" << endl;        
  }
  /* get pointer to the function in the dll*/
  FARPROC handle = GetProcAddress(HMODULE(hInstance), "CreateNewScanner");
  if(!handle){
    // Handle the error
    FreeLibrary(hInstance);
    return "-1";
  }else{    
    // Call the function
    //How to call here??
  }
}

最佳答案

首先,return "-1" 是不行的。您应该返回一个整数。所以你的意思肯定是 return -1

现在进入问题。与其将函数指针声明为 FARPROC,不如将其声明为函数指针类型。

typedef BOOL (*CreateNewScannerProc)(NewScanner*);

然后像这样调用 GetProcAddress:

HMODULE hlib = LoadLibrary(...);
// LoadLibrary returns HMODULE and not HINSTANCE
// check hlib for NULL

CreateNewScannerProc CreateNewScanner = 
    (CreateNewScannerProc) GetProcAddress(hlib, "CreateNewScanner");
if (CreateNewScanner == NULL)
    // handle error

// now we can call the function
NewScanner newScan;
BOOL retval = CreateNewScanner(&newScan);

综上所述,库通常会附带一个头文件(你的显然有,所以你应该包含它)和一个用于加载时链接的 .lib 文件。确保将 .lib 文件传递​​给链接器,您可以简单地执行以下操作:

#include "NameOfTheHeaderFileGoesHere.h"
....
NewScanner newScan;
BOOL retval = CreateNewScanner(&newScan);

无需再使用 LoadLibraryGetProcAddress 等等。

关于c++ - 从 C++ 调用 Win32 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18100044/

相关文章:

C++ memset/memcpy/strcpy 实现 - 检查缓冲区溢出

C++将数据从数据文件输入到结构变量中

c++ - 这个数组大小模板是如何工作的?

java - java中如何获取给定dll的路径?

C++,dll的多个实例,单例

c++ - Boost::序列化 std::unordered_map<double, std::vector<double>>

C++ UUID 到 STL 字符串

c++ - winapi listview检查项c++

c++ - 设置/删除窗口子类时正确传递/删除数据

c# - 如何在 64 位项目中引用 32 位 DLL?