2

首先,我有一个由 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.DLLKERNEL32.DLL而使用 cl.exe 构建的 dll 仅依赖于KERNEL32.DLL

在实际情况中,我有一个更复杂的 porgram,它使用 VS2010 IDE 导出一个 dll 和一个 .h 文件。我必须做一些工作才能在我的 node.js 程序中调用这个 dll。我在哪里错了,我该怎么办?

4

0 回答 0