gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:51:54 30 4
gpt4 key购买 nike

我是 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/

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