首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

Delphi调用C++ dll有关问题

2012-03-22 
Delphi调用C++ dll问题C++ 函数int __stdcall wsf_findCbdjxx(const char *soap_endpoint, char* username

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;

热点排行