VC6.0+gSOAP单步调试跟踪到input1没值,求救net

山书生 2010-06-24 07:44:18

int SendParamter( char *saleOrder)
{
ns2__MBFRequestHeader header; //定义 header
ns3__ivrQueryDeliveryinfosaleOrderNo saleOrderNo; //
ns3__ivrQueryDeliveryinfoRequestBody body; //定义 body
ns3__ivrQueryDeliveryinfoRequest request; //定义 request

ns3__ivrQueryDeliveryinfodeliveryInfo deliveryInfo; //定义 serviceInfo SOA返回详细信息
ns3__ivrQueryDeliveryinfoResponse response; //定义 response

_ns3__ivrQueryDeliveryinfo soapinput; //定义 soap输入信息
_ns3__ivrQueryDeliveryinfoResponse soapoutput; //定义 soap输出信息

//初始化soap
struct soap soap;
soap_init ( &soap );

const char* server = "http://192.168.1.53:9996/ServiceWeb/mb"; //服务器URL

//给输入变量赋值
header.MBServiceCode = "MBF_IVR_QUERY_DELIVERYINFO"; //-0-
//saleOrderNo = **body.saleOrderNo;
char *low = new char[256];
saleOrderNo.low = saleOrder; //-1-IVR收销售订单号,送至SOA //将传入值赋给传递参数项,两边皆是char *.
//body.saleOrderNo = &saleOrderNo.low; //将char* low的内存地址上字符拷贝给TYPE_SON **

request.MbfHeader = &header;
request.MbfBody = &body;

soapinput.input1 = &request;

//输出项--记录到DBtable
char *deliveryNo = new char[256]; //-4-SOA返回交货单号
//调用Webservice
if(soap_call___ns1__ivrQueryDeliveryinfo(&soap,server,NULL,&soapinput,&soapoutput) == SOAP_OK)
{
//........

int main(int argc, char* argv[])
{
int iThread = 0;
cout<<"输入启动线程数:";
cin>>iThread;
for (int i=0; i<iThread; i++)
{
_beginthreadex(NULL, 0, ReadDatabaseThread, NULL, 0, NULL);
}

while(k<iThread)
{
Sleep(4000);
}

return 0;
}


//soapStub.h
class SOAP_CMAC ns3__ivrQueryDeliveryinfoRequestBody
{
public:
int __sizesaleOrderNo; /* sequence of elements <saleOrderNo> */
ns3__ivrQueryDeliveryinfosaleOrderNo **saleOrderNo; /* optional element of type ns3:ivrQueryDeliveryinfosaleOrderNo */
struct soap *soap; /* transient */
//..........
class SOAP_CMAC ns3__ivrQueryDeliveryinfosaleOrderNo
{
public:
char *low; /* optional element of type xsd:string */
struct soap *soap; /* transient */


这里面,saleOrderNo.low获取到了传递进去的saleOrder,但是源码里不知道是否没有将这个值传给body~
求教该如何解决~
对**跟&一直很晕b
...全文
84 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
山书生 2010-06-29
  • 打赏
  • 举报
回复
ON C++ BOARD
THX EVERYBODY :)
山书生 2010-06-25
  • 打赏
  • 举报
回复

header.MBServiceCode = "MBF_IVR_QUERY_DELIVERYINFO";
char *low = new char[256];
strcpy(low,saleOrder);
saleOrderNo.low = low
body.saleOrderNo = (ns3__ivrQueryDeliveryinfosaleOrderNo **)&saleOrderNo; request.MbfHeader = &header;
request.MbfBody = &body;
soapinput.input1 = &request;

其实不论是否用new,调试过程,地址传递到强制转换之后就对应不上了。
以上调试

|- request {...}
|- MbfBody 0x0090fedc
|- saleOrderNo 0x0090feec
|- 0x004dc348 const ns3__ivrQueryDeliveryinfosaleOrderNo::`vftable'
+ __vfptr 0x0040100f ns3__ivrQueryDeliveryinfosaleOrderNo::soap_type(void)
+ low 0x00401bcc "開y"
+ soap 0x0040106e ns3__ivrQueryDeliveryinfosaleOrderNo::soap_serialize(struct soap *)

不知为何saleOrderNo之下多了一个层级。按理saleOrderNo之下就直接使__vfptr、low和soap了。不论强制转换**)&saleOrderN还是**)&saleOrderNo.low(后者在多出的 层级下又有 一个 __vfptr、low和soap结构)
oyljerry 2010-06-25
  • 打赏
  • 举报
回复
low, saleOrder都是字符串指针,你把saleOrder付给low,就需要保证low处理的时候saleOrder指向的数据还是有效的,最好把saleOrder指针分配的数据放到堆上,用new来分配
stonewater 2010-06-25
  • 打赏
  • 举报
回复
帮顶,up
山书生 2010-06-25
  • 打赏
  • 举报
回复

int SendParamter( char *saleOrder) {
//......
return 0;
}

int k = 0;

unsigned int __stdcall ReadDatabaseThread(void *param)
{
for (int i=0; i<10; i++)
{
SendParamter("200004294");
}
k++;
return 0;
}

int main(int argc, char* argv[])
{
int iThread = 0;
cout<<"输入启动线程数:";
cin>>iThread;
for (int i=0; i<iThread; i++)
{
_beginthreadex(NULL, 0, ReadDatabaseThread, NULL, 0, NULL);
}
while(k<iThread)
{
Sleep(4000);
}
return 0;
}
山书生 2010-06-25
  • 打赏
  • 举报
回复
从结构上,是要将SendParamter(char *saleOrder )值传入到request.input1.body.saleOrderNo.low
可能我写的SendParamter(char *saleOrder )就不太对。
不知道该如何将这个传给low.

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧