首先,我有一个由 vs2010 IDE 生成的add.dll,
添加.h:
#define _EXPORT
#ifndef _EXPORT
#define EXPORT __declspec(dllimport)
#else
#define EXPORT __declspec(dllexport)
#endif
EXPORT int add(int a,int b);
添加.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 工具而不是 vs2010 IDE 本身构建和链接这个 pdf.c:
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-ffi和node.js来调用它:
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.exe 构建的 dll 仅依赖于KERNEL32.DLL。
在实际情况中,我有一个更复杂的 porgram,它使用 VS2010 IDE 导出一个 dll 和一个 .h 文件。我必须做一些工作才能在我的 node.js 程序中调用这个 dll。我在哪里错了,我该怎么办?