Delphi调用C++ dll问题
C++ 函数
int __stdcall wsf_findCbdjxx(const char *soap_endpoint, char* username, char* password, char* cbsbh, char* returnStr) {
ns1__findCbdjxx req;
ns1__findCbdjxxResponse result;
int iRet = 0;
struct soap soap;
soap_init(&soap);
//soap_wsse_add_UsernameTokenText(&soap, NULL, username, password);
// To add a user name token with password digest
soap_wsse_add_UsernameTokenDigest(&soap, NULL, username, password);
req.arg0 = cbsbh;
soap_call___ns1__findCbdjxx(&soap, soap_endpoint, NULL, &req, &result);
if (soap.error) {
iRet = soap.error;
/*
if(soap.error > 1){
iRet = -(soap.error);
}else {
iRet = soap.error;
}*/
} else {
// 设返回值
iRet = 0;
//内存空间不够存放字符串
if(strlen(returnStr) < strlen(result.return_)){
iRet = -101;
}else {
iRet = 1;
strcpy(returnStr, result.return_);
}
}
return iRet;
}
Delphi
dll函数定义:
Function wsf_findCbdjxx(soap_endpoint,username, password, cbsbh : pchar; returnStr:PChar): integer; stdcall; external 'vims5services.dll' ;
函数调用:
var MYSOAP_ENDPOINT, MYUSERNAME, MYPASSWORD, scbsbh: pchar ;
temp : string ;
xmlStr: Pchar;
aa: integer ;
begin
MYSOAP_ENDPOINT := 'http://114.251.210.54:8008/vims5services/Vims5Service';
MYUSERNAME := 'vims5';
MYPASSWORD := 'BraveYet';
scbsbh := 'CN197949666381';
// Getmem(xmlStr,10000);
xmlStr := StrAlloc(1000);
aa:= wsf_findCbdjxx(MYSOAP_ENDPOINT, MYUSERNAME, MYPASSWORD, scbsbh, xmlStr);
temp := xmlStr ;
Memo1.Lines.add('aa:'+intTostr(aa)) ;
Memo1.Lines.add('temp:'+temp) ;
//Freemem(xmlStr);
StrDispose(xmlStr);
end;
返回值
aa:-101
temp:?
这是为什么呢,
StrAlloc(10000);
StrAlloc(100000);
StrAlloc(1000000);
我都试过了,不行,delphi给指针分配的内存到C++中会丢吗?各位大虾帮帮忙,这是什么问题?
[解决办法]
xmlStr: array[0..199]of char;
ZeroMemory(@xmlStr,200);
...
还有vc的dll需要用Delphi自带的工具转换一下才能调用。
[解决办法]
LZ试一下 类似这样的定义看看 wsf_findCbdjxx(var soap_endpoint:pchar.....
[解决办法]
我是新手,LZ这样改试试呢? 直接先分配空间。
函数调用:
var
MYSOAP_ENDPOINT : array[0..255] of char;
MYUSERNAME : array[0..255] of char;
MYPASSWORD : array[0..255] of char;
scbsbh : array[0..100] of char;
temp : string ;
xmlStr: array[0.1024] of char;
aa: integer ;
begin
fillchar(MYSOAP_ENDPOINT,sizeof(MYSOAP_ENDPOINT),#0);
fillchar(MYUSERNAME,sizeof(MYUSERNAME),#0);
fillchar(MYPASSWORD ,sizeof(MYPASSWORD),#0);
fillchar(scbsbh,sizeof(scbsbh),#0);
fillchar(xmlStr,sizeof(xmlStr),#0);
strcopy(@MYSOAP_ENDPOINT,pchar('http://114.251.210.54:8008/vims5services/Vims5Service'));
strcopy(@MYUSERNAME,pchar('vims5'));
strcopy(@MYPASSWORD,pchar('BraveYet'));
strcopy(@scbsbh,pchar('CN197949666381'));
aa:= wsf_findCbdjxx(MYSOAP_ENDPOINT, MYUSERNAME, MYPASSWORD, scbsbh, xmlStr);
temp := xmlStr ;
Memo1.Lines.add('aa:'+intTostr(aa)) ;
Memo1.Lines.add('temp:'+temp) ;
end;