首先,我有一个由vs2010 IDE生成的 add.dll ,
add.h:
#define _EXPORT
#ifndef _EXPORT
#define EXPORT __declspec(dllimport)
#else
#define EXPORT __declspec(dllexport)
#endif
EXPORT int add(int a,int b);
add.c:
#include "add.h"
int add(int a,int b) {
return a+b;
}
然后,我想在另一个 pdf.c 程序中调用此add.dll:
#include "add.h"
#include <windows.h>
#define _EXPORT
// #pragma comment(lib,"add.lib")
// __declspec(dllimport) int add(int a,int b);
typedef int (*DLLFUN)(int a, int b);
DLLFUN fun;
EXPORT int dosome(int a,int b) {
HMODULE hdll = LoadLibrary("add.dll");
if(hdll!=NULL){
// DLLFUN add = NULL;
fun=(DLLFUN)GetProcAddress(hdll,"add"); //----here find the add fun
return fun(a,b);
}
return 0;
} 我用vs2010工具构建和链接这个pdf.c,而不是vs2010 IDE本身:
cl.exe /D_USRDLL /D_WINDLL C:\Users\liz\Desktop\pdfdll\Release\pdf.c /link /DLL /OUT:C:\Users\liz\Desktop\pdfdll\Release\pdf.dll
然后获取 pdf.dll ,我想用node.js node-ffi 来调用它:
var ffi = require('ffi');
var ref = require('ref');
var intPtr = ref.refType(ref.types.int);
var libm = ffi.Library(__dirname+'\\pdf.dll', {
'dosome': [ 'int', [ 'int','int' ] ]
});
var a = libm.dosome(1,5);
console.log(a);
因此,console.log输出0表示pdf.c程序,它无法加载add.dll库。
但奇怪的是,当我使用上面的vs2010工具构建和链接add.c和add.h时,它会打印出正确答案6。
所以,我试图找到这两种方法的不同之处。我使用 Dependency Walker 来查找使用vs2010 IDE构建的dll依赖于 MSVCR100.DLL 和 KERNEL32.DLL ,同时使用cl构建dll .exe仅依赖于 KERNEL32.DLL 。
在实际情况中,我有一个更复杂的porgram,它使用VS2010 IDE导出dll和.h文件。我必须做一些工作来在我的node.js程序中调用这个dll。我哪里错了,我该怎么办?