接口调用返回参数类型问题

AsTer1a 2016-04-05 11:09:29
BOOL PostDataU(const wchar_t * sPostData,wchar_t*sRst,const int iMaxRstLen);
参数说明:
sPostData: post的url 参数: SITE=2000&SFC=28888...
sRst: 返回的结果
iMaxRstLen: sRst可接收的最大长度, 例如: char sRst[100]; 或 char *sRst; sRst=new char[100]; iMaxRstLen的值是100. 100个字符包含字符串结束符 '\0'
return 返回执行成功或失败(有需要打印的, 无论打印成功或失败, 对return 无影响)
编码说明:
此方法固定用 宽字节 unicode码.

调用Demo

void NewDlg::OnBnClickedPostdatac()
{
wchar_t Temp[1200] = {0};
CStringW url;
CStringW textVal;
//IDC_EDIT1
GetDlgItemText(IDC_EDIT1,textVal);
textVal=textVal.Trim();
if(textVal.GetLength()==0){
url=_T("SITE=2000&WIFIMAC=b898f7630b57&TESTRESULT=1&SFC=2609A2015033100013&RESOURCE=AA06-IMEI-01&PSENSOR=PSensor_close:;PSensor_far_away:;PSensor_Noise:;PSensor_valid:&PRINTSOFTREV=null&PMEID=NULL&PLATFORM=MTK&PIMEI=NULL&OPERATION=ASSY-IMEI&NETCODE=123456780000080&NCDES=NULL&NCCODE=NULL&MMEID=NULL&MIMEI=888888880000182&ISWIFI=null&ISPRINT=1&ISOFTREV=null&ISMEID=null&ISIMEI=null&ISCALMES=null&BBID=15010041574d42335201ea35ec6ca100");
SetDlgItemText(IDC_EDIT1,_T("SITE=2000&WIFIMAC=b898f7630b57&TESTRESULT=1&SFC=2609A2015033100013&RESOURCE=AA06-IMEI-01&PSENSOR=PSensor_close:;PSensor_far_away:;PSensor_Noise:;PSensor_valid:&PRINTSOFTREV=null&PMEID=NULL&PLATFORM=MTK&PIMEI=NULL&OPERATION=ASSY-IMEI&NETCODE=123456780000080&NCDES=NULL&NCCODE=NULL&MMEID=NULL&MIMEI=888888880000182&ISWIFI=null&ISPRINT=1&ISOFTREV=null&ISMEID=null&ISIMEI=null&ISCALMES=null&BBID=15010041574d42335201ea35ec6ca100"));
}
else{
url=textVal;
}

typedef BOOL (__stdcall *APIEnd)(const wchar_t*,wchar_t*,int);

HLib lib;
if(!lib.init())
{
AfxMessageBox(_T("加载 MES dll失败"));
return;
}
try{
APIEnd PostEnd=(APIEnd)lib.getFARPROC("PostDataU");
if (PostEnd==NULL)
{
AfxMessageBox(_T("加载 MES dll PostData失败"));
return ;
}
PostEnd(url,Temp,1200);
}catch(std::exception &e){
CString cs;
cs.Format(_T("%s"),e.what());
AfxMessageBox(cs);
}
AfxMessageBox(Temp);
}



int i = 1200;
StringBuilder sb = new StringBuilder(i);
bool b = MesDLL.PostDataU( url,ref sb, i);
MessageBox.Show(b.ToString()+"+"+sb);

class MesDLL
{
[DllImport("MESScan.dll", EntryPoint = "PostDataU",CharSet =CharSet.Unicode)]
public static extern bool PostDataU( string url, ref StringBuilder sb, int length);
}

Demo 调用结果返回false ,rst 打印连接不上服务器。C#调用返回false ,rst用stringbuilder返回为空。
在C#里,这个返回参数应该用什么类型,求教各位
...全文
243 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Poopaye 2016-04-05
  • 打赏
  • 举报
回复
另外iMaxRstLen你要确认下究竟是 字节数or字符数
Poopaye 2016-04-05
  • 打赏
  • 举报
回复
ref去掉就行
AsTer1a 2016-04-05
  • 打赏
  • 举报
回复
引用 4 楼 shingoscar 的回复:
那可以再试下: public static extern bool PostDataU( string url, [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder sb, int length);
这样写的话sb 有返回值但是这个返回值乱码了
Poopaye 2016-04-05
  • 打赏
  • 举报
回复
再不行用c++写个中间层,自己往sb里写点东西,看看什么情况
Poopaye 2016-04-05
  • 打赏
  • 举报
回复
那可以再试下: public static extern bool PostDataU( string url, [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder sb, int length);
AsTer1a 2016-04-05
  • 打赏
  • 举报
回复
引用 1 楼 shingoscar 的回复:
ref去掉就行
去掉 ref后程序直接退出了,iMaxRstLen应该是字节数。我这没有DLL源码,只有一个接口文件说明,接口文件和一个C++的Demo。说明以及DEMO 部分都贴上去了

110,524

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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