我是 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);
无需再使用 LoadLibrary
、GetProcAddress
等等。
关于c++ - 从 C++ 调用 Win32 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18100044/