忙了一天,还是没有解决,VB调用delphi做的DLL返回Pchar类型问题(100分)

Y

yansh

Unregistered / Unconfirmed
GUEST, unregistred user!
[red]DLL声明如下:
function GetIdeDiskSerialNumber : pchar;stdcall;
调用声明如下:
Private Declare Function GetIdeDiskSerialNumber Lib _
"HardDiskSN.dll" () As Long
调用如下:
Private Sub Command1_Click()
ss = GetIdeDiskSerialNumber
Label1.Caption = ss
End Sub
得到的值不对,而在delphi下一切正常!
procedure TForm1.Button1Click(Sender: TObject);
var
ss:string;
begin
ss:=GetIdeDiskSerialNumber;
label1.Caption :=trim(ss);
end;

别告诉我用delphi调用。我做这个dll是给一位朋友用的。他只会VB.
100分吧[:D][/red]
 
在DLL中给返回值符值时最好用StrPLCopy,并限定返回字节数,就没问题。
 
问题估计出在dll,把dll中这个函数贴出来
 
另,VB中要先分配字符串空间:
ss as string;
ss = space(256);
然后用ss去接收返回值。
 
哦,错了,像你声明的这种函数可以不用先分配空间。
 
喂,人家说delphi中是好的。。。。
所以问题尽可以在别的地方,比如
1。他调用的方法错了,根本没有成功调用
2。Delphi做的dll是否在运行时还需要Boralnd的什么玩意,我是说,如果你
Project的选项不对的话。
或者你用VB写????
 
[red]-》kkyy:不对啦,dll返回的是Pchar类型,他应该是一个内存地址。我是不知道VB能否取得他
->PiPi :这个 dll在delphi中调用一切正常。
我的这个dll是用来取得硬盘ID号的,用来保护“知识产权”,嘿嘿![/red][:)]
 
告诉他你用的几个api 函数及用法,他自己去用吧
 
不!需要贴出来,否则神仙也救不了你
 
不贴就算了,不过告诉你,你返回的地址需要在你的函数返回后仍然有效,
在delphi下调用正常不等于你的函数写的正确
 
在详细一点,我的看法是你的变量放的位置不对
 
[red]一定不是dll问题,问题出在VB调用上。
API用法我还是知道的。呵呵[8D]
PIPI你该是高手呀
[/red]
 

还是贴出来吧,否则死定了
 
大富翁以前的帖子上面有这个程序,我把它变成DLL了。
变动如下
function GetIdeDiskSerialNumber :[red] pchar;stdcall;[/red]// string;
........
.......
with PIdSector(PChar(pOutData)+16)^do
begin
ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber));
// SetString(Result,sSerialNumber,SizeOf(sSerialNumber));
[red]Result:=sSerialNumber;[/red]
end;
end;
[red]
exports
GetIdeDiskSerialNumber;
[/red]
红色部分
其他无变化
 
[red]说白了,就是在VB中如何调用delphi编写的DLL函数,他的返回值是delphi的PCHAR类型。
我忙了一天,晕了。是不是去VB的论坛能好些。[/red][:(]
 
就是,不过问题出在在VB里面返回为Long类型
也就是说应该是一个指针。
如何将这个转换成String类型才是真正的问题。
刚才我直接让它返回String,一下子将Computer给Down了。
 
BYTE我试过了,只返回两位数,还不对。
需要源码,在大富翁里搜索[red]硬盘[/red],就可以了
 
那个动态库里面的源码没用,我只是简单的给返回值赋值就可以模仿了。
 
对不起,我不会啊!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
702
import
I
I
回复
0
查看
598
import
I
顶部