当加载由vs2010生成的dll时,C ++ LoadLibrary失败

时间:2015-09-07 12:17:10

标签: c++ node.js dll loadlibrary node-ffi

首先,我有一个由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。我哪里错了,我该怎么办?

0 个答案:

没有答案