=============== dephi7.0中DLL源码:===============
procedure testFun1(out Arg1:array of string;out Arg2:array of integer;out Arg3:integer);stdcall;
begin
Arg1[0]:='aa'; Arg1[1]:='bb';
Arg2[0]:=1001; Arg2[1]:=1002;
Arg3 := 888;
end;
procedure testFun2(out Arg3:integer);stdcall;
begin
Arg3 := 888;
end;=============== VB 调用 ===============
'DLL声明
Private Declare Sub testFun1 Lib "mydll.dll" (ByRef Arg1() As String, ByRef Arg1() As Integer, ByRef Arg3 As Integer)
Private Declare Sub testFun2 Lib "mydll.dll" (ByRef Arg3 As Integer)
Private Sub Command1_Click()
Dim arg1(50) As String
Dim arg2(50) As Integer
Dim arg3 As Integer
arg3 = 0 Call testFun1(arg1(), arg2(), arg3) ' 调用失败,并自动退出程序,为什么??????
Call testFun2(arg3) ' 调用成功,arg3返回888End Sub
procedure testFun1(out Arg1:array of string;out Arg2:array of integer;out Arg3:integer);stdcall;
begin
Arg1[0]:='aa'; Arg1[1]:='bb';
Arg2[0]:=1001; Arg2[1]:=1002;
Arg3 := 888;
end;
procedure testFun2(out Arg3:integer);stdcall;
begin
Arg3 := 888;
end;=============== VB 调用 ===============
'DLL声明
Private Declare Sub testFun1 Lib "mydll.dll" (ByRef Arg1() As String, ByRef Arg1() As Integer, ByRef Arg3 As Integer)
Private Declare Sub testFun2 Lib "mydll.dll" (ByRef Arg3 As Integer)
Private Sub Command1_Click()
Dim arg1(50) As String
Dim arg2(50) As Integer
Dim arg3 As Integer
arg3 = 0 Call testFun1(arg1(), arg2(), arg3) ' 调用失败,并自动退出程序,为什么??????
Call testFun2(arg3) ' 调用成功,arg3返回888End Sub
解决方案 »
- 格式化数据
- vb6如何声明在vc6中带有指针的结构体??
- 如何使标题的时间以秒为单位同时变化????在线等
- 初学者:请高手帮我看一下我的程序代码,这不是我想要的结果.问题解决立刻结贴!!!
- 再次散分,想问一下,msflexgrid控件+TEXT控件如何来进行有效的编辑功能?紧急等待中。。。
- 是不是中木马了?一开机硬盘就被设了默认共享(C$)!
- 用vb代码在WIN2000中怎样刷新IPX/SPX,即禁用IPX,再启用IPX,高分求解300分
- 关于SQL SERVER2000 的问题
- 怎么样才能发送和接收16进制的数据????加分了
- 如何对一个null进行判断?
- 请教关于怎么捕获游戏手柄消息的问题
- 客户机上必须要安装Microsoft SOAP Toolkit 3.0才能调用webservice吗?
=============== VB 调用 ===============
Call testFun1(arg1(), arg2(), arg3)
改为
Call testFun1(arg1, arg2, arg3) ' 调用还是失败,并自动退出程序,为什么??????
=============== VB 调用 ===============
改为
Call testFun1(arg1(0), arg2(0), arg3) ' 调用还是失败,报“类型不匹配”错误怎么办啊????
'DLL声明
Private Declare Sub testFun1 Lib "mydll.dll" (ByVal Arg1() As String, ByVal Arg2() As Integer, ByVal Arg3 As Integer)
Private Declare Sub testFun2 Lib "mydll.dll" (ByVal Arg3 As Integer) '你的问题是在testFun1中同时声明了2个Arg1数组,另外将ByRef 全部改为ByVal.
比如传递一个数组:
[in/out]通常将参数定义为一个指针,编译器只负责实现指针的传递,至于数组的大小、成员的类型由调用者和被调用者自己解决;
如果是[out],那么编译器需要将参数堆栈中的数组内容复制到调用者的数组中,这就需要知道具体数组的大小、成员的类型等等具体信息,通常不会在跨语言调用中实现。
uuid(FA3AA1B8-469C-4C8F-AD9E-E49AEA89B508),
version(1.0),
helpstring("Project1 Library")
]
library Project1
{ importlib("stdole2.tlb"); [
uuid(9ADE99CD-D5B9-4E56-B745-74A575BA7C53),
version(1.0),
helpstring("Interface for CoTestOut Object"),
oleautomation
]
interface ICoTestOut: IUnknown
{
[
id(0x00000065)
]
HRESULT _stdcall Method1([in] long Param1, [out] long * Param2 );
}; [
uuid(D03E8985-35CE-44D3-9F3C-996519B89831),
version(1.0),
helpstring("CoTestOut")
]
coclass CoTestOut
{
[default] interface ICoTestOut;
};};[/code]
按这份IDL定义,写一个ActiveX DLL,然后直接在该DLL当中使用Method1的第二个参数,看看这个Param2定义成[out]还是[in, out]有啥区别。
Implements Project1.CoTestOut
可以使用Variant
[/Quote]请问怎么使用Variant?Delphi和VB都要用Variant吗?用数组形式的Variant?
VB和Delphi的代码怎么写?
你应该将参数 Arg2 声明为 [in/out] 型的指针。
而且 VB 的 String 是 COM 标准的 BStr,Delphi 的估计不是;
建议将 Arg1 约定为 [in/out] 型的字符指针,返回内容为用特殊字符分割的单个字符串。procedure testFun1(var Arg1:pchar; var Arg2:pinteger; var Arg3:integer);stdcall;
'VB 会自动将参数 ByVal ... As String 作为 char* 处理
'参数 ByVal ... As Long 等同与 Delphi 的万能指针
Private Declare Sub testFun1 Lib "mydll.dll" (ByVal Arg1 As String, ByVal Arg2 As Long, ByRef Arg3 As Integer)
Private Declare Sub testFun2 Lib "mydll.dll" (ByRef Arg3 As Integer)
Private Sub Command1_Click()
Dim arg1 As String
Dim arg1Arr() as string
Dim arg2(50) As Integer
Dim arg3 As Integer
arg3 = 0 arg1=space(500) '分配足够的字符空间
Call testFun1(arg1, varptr(arg2(0)), arg3)
arg1Arr = split(trim(arg1), "|") ' 假定 | 为约定的分割符
Call testFun2(arg3)
End Sub
begin
Arg1 := VarArrayCreate([0,2-1],varOleStr);
Arg1[0]:='aa'; Arg1[1]:='bb';
Arg2 := VarArrayCreate([0,2-1],varInteger);
Arg2[0]:=1001; Arg2[1]:=1002;
Arg3 := 888;
end;
exports
testFun1;
Private Declare Sub testFun1 Lib "Project1.dll" (ByRef arg1 As Variant, ByRef arg2 As Variant, ByRef Arg3 As Long)Dim str() As String
Dim l() As Long
Dim arg1 As Variant, arg2 As Variant
Dim l1 As Long
Call testFun1(arg1, arg2, l1)
str = arg1
l = arg2
斯琴高娃对中国人来说是外国人,对瑞士来说是本国人,为什么? 参考标准不同
同样的参数堆栈,VB 和 Delphi 理解不同,为什么? 参考标准不同