很简单的DLL调用问题(200分)

  • 主题发起人 nhuangjr
  • 开始时间
N

nhuangjr

Unregistered / Unconfirmed
GUEST, unregistred user!
我要用调用一个DLL,但老是不成功
DLL是用VC写的#pragma once

/*
struct putMsgParam{
CtoGateway * pGW; //in parameter
int * resultCode; //out parameter
char * s_Msg; //in parameter
int s_msgLen; //in parameter
};

struct getMsgParam{
CtoGateway * pGW; //in parameter
int * resultCode; //out parameter
char * r_Msg; //out parameter
int r_BufLen; //in parameter
int * r_msgLen; //out parameter
};
*/
#ifndef GW_API_INTERNAL
#define TOGW_API _declspec(dllimport)
#else
#define TOGW_API _declspec(dllexport)
//内部私有函数


int GetSubstring(char *,const int ,const int ,char *);
char *GetkeyValue(char *fileName,char *sectionName,char *keyName);
int GetMsgLen(char *msg);
bool GetCipherKey(DWORDLONG *key);
bool EncryptMsg(char * msg ,int msgLen);
bool Decrypt(char * msg ,int *msgLen);

//para1(in):对象指针,para2(out):结果返回值,para3(int):要发送的明文消息,para4(int):要发送的消息长度
int putMsgFunc(CtoGateway *,int *,char *,int )

//para1(in):对象指针,para2(out):结果返回值,para3(out):要接收到的明文消息,para4(in):接收缓冲区长度,para5(out):接收到的消息长度
int getMsgFunc(CtoGateway *,int *,char *,int ,int *);

//unsigned long __stdcall putMsgThread(putMsgParam *p_putMsg);
//unsigned long __stdcall getMsgThread(getMsgParam *p_getMsg);

#endif
// public API
extern "C"
{
TOGW_API int gwSzdbGateway(char *,int ,int ,char *, int ,int *,int * );
TOGW_API void GetMyVersion(char *);
}

我要只要调用
TOGW_API int gwSzdbGateway(char *,int ,int ,char *, int ,int *,int * );

我在delphi的声明是
{$IFNDEF gwSzdbGateway}
Function gwSzdbGateway(const StrData:pChar;inbuflen,intdatalen:integer;var StrRet:pChar;outbuflen:integer;outdatelen,reason:pInteger):integer
external 'SzdbGateway.dll' name 'gwSzdbGateway';
{$ENDIF}

这样调用:
procedure TForm1.Button1Click(Sender: TObject);
var
strSend,strRet,logfileName,strLog:string;
RetLen,reason:integer;
logfile:TextFile;
begin
strRet:=' ';
ADOTable1.Active:=True;
strSend:= ADOTable1.fieldbyname('sendstr').asstring;
gwSzdbGateway(PChar(strSend),Length(strSend)+10,Length(strSend)+1,PChar(strRet),Length(strRet)+10,@RetLen,@reason);


end;

但是,老是调用不成功,我想主要应该是声明的问题
请高手们指点

 
Function gwSzdbGateway(StrData:pChar;inbuflen,intdatalen:integer;StrRet:pChar;outbuflen:integer;outdatelen,reason:pInteger):integer
stdcall
external 'SzdbGateway.dll' name 'gwSzdbGateway';
 
换一种调用方式!或者直接用API调用试试!loadlibrary...
 
1、gwSzdbGateway并没指定调用方法,那么和编译器的设置有关,一般来说,他不是stdcall,而是cdecl
2、char* 参数并不能翻译成 var StrRet:pChar,如果STrRet是用来返回一个单个字符的,可以用var ChrRet:char
如果返回一个0结尾的字符串,可以用 StrRet:pChar
3、如果是borland的c编译器编译的,而且没使用def文件,如果是cdecl,那么入口名字改成: name '_gwSzdbGateway' 试试
 
可以了!
pearl的定义是正确的
最主要还是要加 stdcall 这到底什么意思阿???

你们还有一个问题,没有注意的,就是内存分配!
SetLength(strRet,256);
SetLength(strSend,256);
ADOTable1.Active:=True;
strSend:= ADOTable1.fieldbyname('sendstr').asstring;
RetSuc:=gwSzdbGateway(PChar(strSend),256,Length(strSend),PChar(strRet),256,@RetLen,@reason);
 
顶部