vb6.0調用一個delphi寫的DLL ﹐其中一個參數是byte類型的數組﹐程序應該應該如何寫﹗急﹗﹗詳見內容

benxie 2005-06-08 12:09:40
procedure mySendData(ComPort:String;bId:Byte;bDatatoSend:array of Byte);
上面這個是delphi中的

下面的是我vb寫的﹐但是報什么內存不能讀的錯誤:
Public Declare Sub dllMySendData Lib "AAA.dll" (ByVal aaA As String, ByVal bB As Byte, ByVal Ac As Byte)

用時﹕
Dim A() As Byte

A(0) = &HA
A(1) = &H2
A(2) = &H8
A(3) = &H0
A(4) = &H0

A(5) = &HB
A(6) = &H5
A(7) = &H86
A(8) = &H7
A(9) = &H8

A(10) = &H1
A(11) = &H2
A(12) = &H3
A(13) = &H4
A(14) = &H5

Call AAA("1", 7, (A(0)))
...全文
342 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
TechnoFantasy 2005-06-09
  • 打赏
  • 举报
回复
改进了一下Delphi中的mySendData函数,不用copy到一个临时数组了;

function mySendData(bDatatoSend : PByte; pCount : integer;ComPort : String):Integer; stdcall;
var
x : integer;
begin
showmessage(inttostr(pCount));
for x := 0 to pCount - 1 do
begin
showmessage('jjjj : ' + inttostr(Byte(bDatatoSend^)));
inc(bDatatoSend);
end;

result := 0;
end;

VB调用的代码:
Private Declare Function mySendData Lib "project1.dll" _
(ByVal a As Long, ByVal count As Long, ByVal ComPort As String) As Long

Private Sub Command1_Click()
Dim a(2) As Byte

a(0) = 1
a(1) = 2
a(2) = 3

mySendData VarPtr(a(0)), 3, "abcd"
End Sub
TechnoFantasy 2005-06-09
  • 打赏
  • 举报
回复
可以用指针传递,Delphi代码:

library Project1;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
SysUtils,
Classes,
Windows,
Dialogs;

function mySendData(bDatatoSend : PByte; pCount : integer;ComPort : String):Integer; stdcall;
var
x : integer;
arr : array of byte;
begin
showmessage(inttostr(pCount));
setlength(arr, pCount);
copymemory(@arr[0], bDatatoSend, pCount);
for x := 0 to pCount - 1 do
begin
showmessage('jjjj : ' + inttostr(arr[x]));
end;

result := 0;
end;
{$R *.res}
exports
mySendData index 1;
begin
end.

VB调用代码:
Private Declare Function mySendData Lib "project1.dll" _
(ByVal a As Long, ByVal count As Long, ByVal ComPort As String) As Long

Private Sub Command1_Click()
Dim a(2) As Byte

a(0) = "1"
a(1) = "2"
a(2) = "3"

mySendData VarPtr(a(0)), 3, "abcd"
End Sub

ChumpKlutz 2005-06-08
  • 打赏
  • 举报
回复
学习一下.
benxie 2005-06-08
  • 打赏
  • 举报
回复
to gzqg(星野风流) ( )
一開始就是按你說的那樣寫的﹐不行。--->如dll 能自動支持
后來查了資料﹐說是這種情況﹐要把數組的第一個值傳過去就可以了。 --->如dll 不能自動支持
反正能試的都試了:
如:Call AAA("1", 7,a() )
如﹕Public Declare Sub dllMySendData Lib "AAA.dll" (ByVal aaA As String, ByVal bB As Byte, Byref A() As Byte)
call Call AAA("1", 7,a(0))
都不行。
不過還是謝謝﹗

gzqg 2005-06-08
  • 打赏
  • 举报
回复
以上不严谨,应该说A(0)在这里可能没有被看作是数组的地址指针,而被认为是数组的一个具体成员了。
gzqg 2005-06-08
  • 打赏
  • 举报
回复
Call AAA("1", 7, )
(A(0))不是数组参数啊,用A()试试。
benxie 2005-06-08
  • 打赏
  • 举报
回复
謝謝 ﹗我在delphi 中找和問﹗
再次謝謝﹗
kyuwong 2005-06-08
  • 打赏
  • 举报
回复
我对delphi不太熟悉,你应该去delphi区问吧
benxie 2005-06-08
  • 打赏
  • 举报
回复
huangguanshu() ( ) 信誉:103
謝謝﹗謝謝﹗謝謝﹗

現在在改delphi:
delphi 的數組如何變成指針呀?

bDatatoSend[0]
bDatatoSend[1]

請問應該如何改?謝謝﹗
kyuwong 2005-06-08
  • 打赏
  • 举报
回复
dim port as string,data() as byte,id as long
port = "aaa"
redim data(9)
data(0)=1
.
.
.
data(9)=10
id=99
dllMySendData port,len(port),id,data(0),ubound(data)+1
benxie 2005-06-08
  • 打赏
  • 举报
回复
huangguanshu() ( ) 信誉:103
我現在測試中。
benxie 2005-06-08
  • 打赏
  • 举报
回复
huangguanshu() ( ) 信誉:103

這樣參數不是變成5個了嗎?
vb應該如何傳值進去?
謝謝﹗
難道Vb就無解嗎?
難道Vb就無解嗎?
難道Vb就無解嗎?
sanyou98 2005-06-08
  • 打赏
  • 举报
回复
up
kyuwong 2005-06-08
  • 打赏
  • 举报
回复
Public Declare Sub dllMySendData Lib "AAA.dll" (ByVal ComPort As String, byval ComPortLength as long,ByVal bId As Byte, byref bDatatoSend As Byte,byval bDatatoSendlength as long)

上面是delphi的声明,这是vb的声明
kyuwong 2005-06-08
  • 打赏
  • 举报
回复
procedure mySendData(ComPort:pchar;ComPortLength:integer;bId:Byte;bDatatoSend:PByte;bDatatoSendLength:integer);
kyuwong 2005-06-08
  • 打赏
  • 举报
回复
我建议你修改dephi的dll,将数组参数改为一个指针,一个数组长度参数。
还有那个string参数亦一样,改为pchar指针和一个字符串长度参数。
唐古拉山 2005-06-08
  • 打赏
  • 举报
回复
放分太多了不太好

benxie 2005-06-08
  • 打赏
  • 举报
回复
sorry,是﹕如有人幫我解決了﹐我另發貼兩貼給400分。
benxie 2005-06-08
  • 打赏
  • 举报
回复
解決了﹐我另發貼兩貼給400分。
benxie 2005-06-08
  • 打赏
  • 举报
回复
to wumylove1234(毁于随) ( ) 信誉:99
謝謝﹗但
--> 程序報錯致命錯誤﹐內存不能讀﹐然后退出了。

to of123() ( ) 信誉:125
謝謝﹐但
complile error:
type mismathc:array or user-defined type expected

請高手出來解答﹗﹗
不知道和delphi 的dll 本身有沒有問題呢??
加载更多回复(7)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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