vb调用DELPHI的DLL问题(100分)

  • 主题发起人 主题发起人 rikhong
  • 开始时间 开始时间
R

rikhong

Unregistered / Unconfirmed
GUEST, unregistred user!
为什么我VB调用DELPHI做的DLL,传过去的参数都是乱吗?具体看以下代码
我用参数返回的方式返回一串PCHAR字符,在DELPHI下很正常,但VB连传过去的参数都变成乱码

DELPHI DLL:
procedure SetGunState(Despensor_no:pchar;Despensor_state:pchar;protocol:pchar;var ResultCmd:pchar);stdcall;
var StrCmd:string;
value:integer;

begin
SHOWMESSAGE(Despensor_no+' '+Despensor_state+' '+Despensor_state); //VB下到这一句发现所有参数都是乱码
value:=StrToInt(Despensor_no);

if protocol = protocol_HS then
begin
StrCmd:=#$41#$42#$43#$61#$62;
end;

if protocol = protocol_HS1 then
begin
StrCmd:=(#$9B+chr(value)+#$02#$A2);
end;

if protocol = protocol_HS2 then
begin
StrCmd:=(#$9B+chr(value)+#$02#$A2);
end;
ResultCmd:=pchar(StrCmd);
ShowMessage(ResultCmd+StrCmd)
end;

VB 调用代码:
Public Declare Sub SetGunState Lib "C:/HScom.dll" (Despensor_no As String, Despensor_state As String, protocol As String, ByRef CMD As String)

Private Sub Command1_Click()
Dim s As String
s = Space(26)


Module1.SetGunState "2", "1", "AA", s
Text1.Text = s
' Module1.Gets

End Sub
 
Public Declare Sub SetGunState Lib "C:/HScom.dll" (Despensor_no As String, Despensor_state As String, protocol As String, ByRef CMD As String)

你这个定义不正确!
Public Declare Sub SetGunState Lib "C:/HScom.dll" (Byval Despensor_no As String, Byval Despensor_state As String, Byval protocol As String, Byval CMD As String)
//注意需要输出的参数才使用 s = Space(26) 这样的语句
//比如这个参数就要这样 ResultCmd = Space(26)
//其余的赋值进去就可以了
procedure SetGunState(Despensor_no:pchar;Despensor_state:pchar;protocol:pchar;var ResultCmd:pchar);stdcall;
 
PCHAR与string是不同的,要进行转换
例如:SHOWMESSAGE(Despensor_no+' '+Despensor_state+' '+Despensor_state);
--》SHOWMESSAGE(strpas(Despensor_no)+' '+strpas(Despensor_state)+' '+strpas(Despensor_state));
 
谢谢两位,
我在DELPHI返回 #$9B#$02#$9B#$A2 这个串正确 9B 02 9B A2
但同样情况下VB却返回 3F 9B 6F 20 20 20 我的返回参数是Dim s As String * 5
所以后面 的20 20 20 不管 ,其实就返回了3F 9B 6F <> 9B 02 9B A2 为什么?
 
我发现 CHR($9B)+CHR($02)会变成 3F
 
CHR($9B)+CHR($01)也会变成 3F
 
单个9B在VB里变成 00,两个9B = 9B 9B
 
我这里只欢迎有心解决问题的人,混分的请别来
 
var StrCmd:string;  就不该使用这样的数据变量类型! 这是delphi 使用的.
你就直接使用ResultCmd 这个不就完事了吗?
 
如果使用pchar如何这样连接?#$9B+chr(value)+#$02#$A2
 
ResultCmd[0] := $9B ;
ResultCmd[1] := $02;
这样不就可以了吗? 你是存放十六进制数吧! 前面为什么家个"#" 号啊
 
我的DLL的目的是返回一串十六进制,我不知道这样说对不对,直接地说是:
我想用串口发送命令 如68 74 74 70 3A 2F 2F 72 6F 61 72 69 6E 67 77 69我要发送这些数据
前面加个#号我也没搞清楚什么意思,
 
procedure SetGunState(Despensor_no:pchar;Despensor_state:pchar;protocol:pchar;var ResultCmd:pchar);stdcall;
还有这个参数 ResultCmd:pchar 就不用使用 var 了! pchar 本来
就是指针
 
偶不是混分的。
在Delphi中,默认的字符串是AnsiString,而VB中默认是WideString
VB中使用要进行一下转换。MultiByte有关的几个API,忘了,你搜索一下吧。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
问题要一分为二进行@
首先确定传进去的数据对不对,在Delphi接口入口处先将所有参数全部以二进制的形式保存到文件(如果不是纯粹的可见字符串,建议不要使用提示对话框),如果正确则接口正确,否则接口有问题,[:(!]注意VB存在值传递和引用传递,请使用值传递.
如果第一步正确,则请在接口返回前,将待返回的数据也同样以二进制的形式保存到文件.
这样有利于你分析问题.
另外需注意,VB和Delphi两者的字符串是有差异的.

我曾用过Delphi 做过动态库,在其它语言中使用,就利用上面的方法成功解决过问题.
VB不光调用有这些问题,还有在调试时,还存在当前路径的问题,如果你在程序中使用了程序所在目录下的文件的话,就更要注意,建议编译完成后再试.或者将相关文件放一份到VB可执行文件所在目录下.有利于你调试.

---------------------------------------------------------------------
看了你的代码及注释,你的问题应该是接口参数的传递方式不对.
注意 ByVal ByRef 两者的差异,估计你的问题就解决了.

有还有什么问题,可以给我邮件. 祝你好运.
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
611
import
I
I
回复
0
查看
778
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
754
import
I
后退
顶部