delphi编制的DLL在VB中如何调用,变量类型如何对应?(60分)

  • 主题发起人 主题发起人 hqpeng
  • 开始时间 开始时间
H

hqpeng

Unregistered / Unconfirmed
GUEST, unregistred user!
编制一DLL及测试程序(delphi),运行正常.
在NT下运行正常(未装delphi).
可是用VB编制的调试程序却不能运行,提示"程序出现非法操作"后退出VB.
不知何故?在vb中如何定义与delphi中var x PChar对应变量?
 
害得我又装了一遍破vb5!用你前两天的例子。
Private Declare Function ReverseStr Lib "dlltest" (ByVal str As String) As Long

用byval声明值参数传递.
 
可惜,没用过VB,
 
to menxin:
真对不起,让你费心.你试的例子我也试过了,能行.
但是我编的另外一个DLL怎么试都不行,不知为何.
 
vb也的声明external/export之类的!
 
各位大侠:
我将定义部分贴出,此两DLL在delphi中运行没问题.

vb中定义如下:
Private Declare Function RW_CLOSE Lib
"new_Dll.dll" (ID As Integer) As Integer
Private Declare Function RW_REQUEST Lib
"new_Dll.dll" (ID As Integer, ByVal lpstr_s As String) As Integer
Private Declare Function RW_RESET Lib
"new_Dll.dll" (ID As Integer) As Integer
Private Declare Function R_MIM Lib "new_Dll.dll"
(ID As Integer, adds As Integer, numb As Integer, ByVal lpstr_s As String) As Integer
Private Declare Function W_MIM Lib "new_Dll.dll"
(ID As Integer, adds As Integer, numb As Integer,
lpstr_s As String) As Integer
Private Declare Function ReverseStr Lib
"reverse.dll" (ByVal m_str As String) As Integer
Private Declare Function Squared Lib
"reverse.dll" (var_n As Integer) As Integer


DLL中定义如下:

function RW_OPEN(ID:Integer):Integer;export;stdcall;
function RW_CLOSE(ID:Integer):Integer;export;stdcall;
function W_MIM(ID:integer;address:Integer;number:Integer;
m_string:string):integer;export;stdcall;
function R_MIM(ID:integer;address:Integer;number:Integer;
var text:PChar):integer;export;stdcall;
function RW_REQUEST(ID:integer;var Chipn:PChar)
:integer;export;stdcall;
function RW_RESET(ID:Integer):integer;export;stdcall;
function Squared(var va:integer):integer;export;stdcall;
function ReverseStr(StrToReverse:Pchar):integer;export;stdcall;


ReverseStr和Squared两函数运行正确.

另:如下两处定义的表达方式使我感到迷惑.
1.DLL中ReverseStr的参数未定义为var,在vb中定义时加byval,
参数能带回反转结果;
2.DLL中Squared的参数定义加var,在vb中不用加byval,参数能带回平方值.

不知为何?
 
我也碰到类似问题.
 
你的意思的new_dll中的所有函数都不好用?
 
ReverseStr和Squared没有问题.

因为第一个函数有问题,其他函数不能调试,所以是否有问题就不知道了.

在第一个函数中加入showmessage,发现传递到DLL中的ID数值不对.
比如在vb中传递id=2,而在DLL中变成了62550520,所以出现非法错误.
为什么会这样?
 
第一个函数? rw_open ? 上面vb中也没有定义啊.
我又做了一个dll,形式与rw_open一样,没出现什么问题,是否你的dll有问题.
 
to menxin:

贴漏了第一个函数定义:

Private Declare Function RW_OPEN Lib
"new_DLL.dll" (ID As Integer) As Integer

能想到的办法都试过了,就是不行.
照着Squared函数的定义,也试过了,不行.
能将你的定义方法贴出来吗?
 
呵呵, in Delphi:
Pchar 表示pointer, 接受到的只是一个32位数, 指向具体的由#0结尾的字符串.
var表示传地址, 把具体数值所在的地址当作参数传递.
所以var pchar = string的地址的地址. 但是你vb中只有一个byval, 也就是只是把字串
的地址传到dll中.
dll里解释参数时, 先把传进来的数当作地址, 转到这个的地址上(var 的作用), 然后把那
个具体地址里头32位数当成另一个地址(pchar作怪), 转到那个地址准备找#0结尾的字符串, 鬼
道这时已经转到哪去了! (大部分情况下应该出现非法内存访问了).
 
Ather_eYes的帖子给了我一点启发.对vb程序做了一点修改,头两个函数RW_OPEN和
RW_CLOSE没问题了,改动是将ID定义为LONG.可能vb中的integer是16位整数.
 
经调试,程序顺利通过.感谢诸位的帮助.
总结:
1.在vb中将integer改为long.
(有几个不改也行,不知为何?改为long后肯定没问题)
2.在DLL中都加var.

但是,原用delphi编制的调试程序却不能运行了.(再调试后做总结吧)
 
后退
顶部