涉及dll/so调用,结构体参数类型如何定义,函数如何调用呢
发布于 7 年前 作者 Einsy 4868 次浏览 最后一次编辑是 5 年前 来自 问答

这是部分 .h 头文件

#ifndef _GENERIC_GB_API_H_
#define _GENERIC_GB_API_H_

#ifdef WIN32
#ifdef DLL_GBSDK
#define GBAPI _declspec(dllexport)
#else
#define GBAPI _declspec(dllimport)
#endif
#else
#define GBAPI
#endif

typedef unsigned long long UINT64;
typedef long long INT64;

#ifdef __cplusplus 
extern "C" { 
#endif 

typedef struct _LogInfo
{
	char severip[16]; //内存占16个字节
	int  severport;
    char severid[24];
    char localip[16];
    int  localport;
	char username[24];
	char password[64];
    int  keepalive;
	int  timeout;
	int  expires;
}LogInfo;

typedef void (*Callback_Offline)( void *userdata );

void GBAPI NP_GB_Init();

int GBAPI NP_GB_Login( void* userdata, LogInfo &info, Callback_Offline callback );

int GBAPI NP_GB_OpenToDecoder( char* id, char* decoder );
#ifdef __cplusplus 
}  
#endif
#endif

我想问的是如何调 NP_GB_Login 函数呢?写了一部分代码,下面不知道该如何写了,这个结构体定义正确吗?

var ffi = require('ffi');
var ref = require('ref');
var Struct = require('ref-struct');
//var hWnd = new Buffer(8);
var int64_t = ref.types.int64;
var voidptr = ref.refType(ref.types.void);
var intptr = ref.refType(ref.types.int);
var uint8_ptr = ref.refType(ref.types.uint8);
/** 登录信息
 *
 */
var _LogInfo = Struct({
  'severip': "string",
  'severport': "int32",
  "severid": "string",
  "localip": "string",
  "localport": "int32",
  "username": "string",
  "password": "string",
  "keepalive": "int32",
  "timeout": "int32",
  "expires": "int32"
});
//byte[24];
var _LogInfoPtr = ref.refType(_LogInfo);
var Callback_Offline=ffi.callback("void",["void"],function(userdata){

});
var SDKHandle = ffi.Library('./sdk.dll', {
  'NP_GB_Init': ['void', ["void"]],
  'NP_GB_Cleanup': ['void', ["void"]],
  'NP_GB_Login': ['int', ["void",_LogInfoPtr,"pointer"]],
  'NP_GB_Logout': ['void', ["void"]]
});

运行不正常。哪里不正确呢

6 回复

看不懂问题… 先给楼主格式化一遍代码…

@jiyinyiyong 已经格式化了,请指点一下,谢谢了

node.js哪能直接调用c代码呢?得编写一个 addon

该问题已经被解决,结构体直接使用node-struct模块,如果还是不好用,那么就直接申请一块连续的内存来处理! nodejs调用c接口的dll,如果有回调的接口,该进程一定要阻塞住不要退出,但是不要使用while死循环来阻塞。

最近也遇到这个问题,方便把解决代码贴下么,谢谢

@lvhy 你可以加入这个群QQ 397941452

回到顶部