2

まず、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;

そして、このpdf.cをvs2010ツールでビルドしてリンクしますが、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

次に、node.jsでnode-ffiを使用して呼び出したいpdf.dllを取得します。

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 が出力されます。

だから、私はこの2つの方法が違うものを見つけようとしました。Dependency Walkerを使用して、 MSVCR100.DLLおよびKERNEL32.DLLに依存する vs2010 IDE での dll ビルドが、 cl.exe での dll ビルドがKERNEL32.DLLのみに依存することを確認します。

実際の状況では、VS2010 IDE を使用して dll と .h ファイルをエクスポートする、より複雑なプログラムがあります。node.js プログラムでこの dll を呼び出すには、いくつかの作業を行う必要があります。どこが間違っていて、どうすればよいですか?

4

0 に答える 0