指针变量作函数参数出现的问题

sunjiancn 2006-08-12 08:48:06
在传递参数的时候 使用了
string s="code project is cool!";
char[] b=new char [100];
s.CopyTo(0,b,0,21);
fixed(char *p=b)
RefComm.GetBufData(28,p,39,4);
//RefComm.GetBufData为加载的调用函数

结果函数的调用异常。返回第三个参数39的时候,从调用函数里返回的是个8位的随机数,如90980100
而不是39 。有高手知道是什么原因吗? 是否与fixed的使用有关?
...全文
416 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunjiancn 2006-08-12
  • 打赏
  • 举报
回复
呵呵 谢谢各位了 我挨个试CallingConvention的方法 使用ThisCall就可以了
terry_12 2006-08-12
  • 打赏
  • 举报
回复
你把这些属性都去掉试试
sunjiancn 2006-08-12
  • 打赏
  • 举报
回复
TO:怪问题.
你也声明变量传进去试试
int TerNo= 39;
你试试用C++调用,看有没有出现同样问题呢?

我int TerNo= 39;
了还是一样 我怀疑是 [DllImport("TerAccDll_try.dll",EntryPoint="GetBufData",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)] public static extern int GetBufData(long a,char* b,int c,int d);
中CharSet和CallingConvention的设置的问题 导致参数传递时有误


kingtoo008 2006-08-12
  • 打赏
  • 举报
回复
路过...
------------------------------------------------------------------------------------
100M.Net空间+50M企业邮局=60元/年
100M.Net空间+国际顶级域名=100元/年
国际顶级域名.com.net.cn=50元/年
本站申请域名可绑定免费10M Asp.Net空间
1000M.Net空间 + 100M MsSql数据库 + 1000M企业邮局 + 顶级域名=600元/年
数据库 企业邮局 网站推广 整机租用 美国空间 网站建设 均有售
还有很多优惠套餐提供给各个用户层.
有意者可联系电话:021-64802212 传真:021-64802212
咨询信箱:info@kingtoo.com 咨询OICQ:68311305,379620139 81778640

terry_12 2006-08-12
  • 打赏
  • 举报
回复
怪问题.
你也声明变量传进去试试
int TerNo= 39;
你试试用C++调用,看有没有出现同样问题呢?
kingtoo008 2006-08-12
  • 打赏
  • 举报
回复
路过...
------------------------------------------------------------------------------------
100M.Net空间+50M企业邮局=60元/年
100M.Net空间+国际顶级域名=100元/年
国际顶级域名.com.net.cn=50元/年
本站申请域名可绑定免费10M Asp.Net空间
1000M.Net空间 + 100M MsSql数据库 + 1000M企业邮局 + 顶级域名=600元/年
数据库 企业邮局 网站推广 整机租用 美国空间 网站建设 均有售
还有很多优惠套餐提供给各个用户层.
有意者可联系电话:021-64802212 传真:021-64802212
咨询信箱:info@kingtoo.com 咨询OICQ:68311305,379620139 81778640

sunjiancn 2006-08-12
  • 打赏
  • 举报
回复
TO:你的意思是第3个参数在函数里面值出现变化?

是啊 就是这个意思
sunjiancn 2006-08-12
  • 打赏
  • 举报
回复
TO:GetBufData这个函数内是否要给p1分配空间?

不清楚啊 分配和不分配各有什么解决办法吗? 写这个DLL的人刚出去了
terry_12 2006-08-12
  • 打赏
  • 举报
回复
你的意思是第3个参数在函数里面值出现变化?
sunjiancn 2006-08-12
  • 打赏
  • 举报
回复
TO:楼主试下:
byte[] bytevalue =new byte[500]
RefComm.GetBufData(28,bytevalue,39,4);

基本是一样的 我尝试过byte[] bytevalue =new byte[500] ,
StringBuilder还有指针变量 结果都一样。

我想关键是参数传入到GetBufData函数体内部出了错,可能是传输过程有问题

不管函数是否调用成功 单单看参数传入到GetBufData函数体内部就出问题了 本来传进去4个参数28,P,39,4

结果在GetBufData里一看 39传到函数体内部就变成了90980100 每次刷新还不断变化 但都是一个8位数

Knight94 2006-08-12
  • 打赏
  • 举报
回复
GetBufData这个函数内是否要给p1分配空间?
Knight94 2006-08-12
  • 打赏
  • 举报
回复
那你看看错误具体是什么
terry_12 2006-08-12
  • 打赏
  • 举报
回复
楼主试下:
byte[] bytevalue =new byte[500]
RefComm.GetBufData(28,bytevalue,39,4);
sunjiancn 2006-08-12
  • 打赏
  • 举报
回复
GetBufData
读取交易记录。
function GetBufData (
idx:Longint;
p1:PChar;
TerNo:integer;
Port:integer =1):integer;

参数
idx
待读取的交易记录号。
P1
返回读取的数据。
TerNo
终端机号。
Port
串口号。

返回值
如果函数调用成功,返回值为1000。
如果函数调用失败,返回值不为1000。如需得到错误描述,请调用GetTAErrMsg。

sunjiancn 2006-08-12
  • 打赏
  • 举报
回复
恩 好的 我找找 一直没看 等一下
Knight94 2006-08-12
  • 打赏
  • 举报
回复
dll函数原型是什么
sunjiancn 2006-08-12
  • 打赏
  • 举报
回复
to: to 那用指针变量传递时出错 是何解呢?

调用有问题?

所以 我认为会不会是我加载DLL时参数在传输方式 或者过程中就出了错
sunjiancn 2006-08-12
  • 打赏
  • 举报
回复
TO:buffer不够大?

StringBuider strValue = new StringBuilder( 100 );// Set buffer size here such as "200" or more


///////////////
我设到2000 只是1466184 变成了132784144...
sunjiancn 2006-08-12
  • 打赏
  • 举报
回复
to: to 那用指针变量传递时出错 是何解呢?

调用有问题?


////////////
在传递参数的时候 如果不用StringBuilder而使用指针变量的话
string s="code project is cool!";
char[] b=new char [100];
s.CopyTo(0,b,0,21);
fixed(char *p=b)
RefComm.GetBufData(28,p,39,4);
//RefComm.GetBufData为加载的调用函数

不管函数是否调用成功 单单看参数传入到GetBufData函数体内部就出问题了 本来传进去4个参数28,P,39,4

结果在GetBufData里一看 P指针变量后面的 39传到函数体内部就变成了90980100 每次刷新还不断变化 但都是一个8位数
Knight94 2006-08-12
  • 打赏
  • 举报
回复
buffer不够大?

StringBuider strValue = new StringBuilder( 100 );// Set buffer size here such as "200" or more
加载更多回复(11)

110,545

社区成员

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

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

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