标题:[求助]Dll的传递问题
只看楼主
smallpuppy
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-7-25
 问题点数:0 回复次数:8 
[求助]Dll的传递问题
我在VC里编写了一个DLL文件,现在要将它导入到VB的应用程序中
函数的某个参数在vc中是结构体数组,在VB中相应的是记录数组

请问 参数在传递时该怎么写,我怎么试都不正确

请高手们帮忙,非常感谢
搜索更多相关主题的帖子: Dll 
2006-07-25 15:25
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-26 08:36
smallpuppy
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-7-25
得分:0 

谢谢穆扬,你说的是正确的
我写的不是很清楚

今天在网上搜到了一个相关主题的文章:

VB结构体的字节对齐和VC结构体的字节对齐有什么区别?
用户自定义类型(User-defined Type)参数的传递

  用户自定义类型在VB中是一种重要的数据类型,它为编程者提供了很大的灵活性,使开发人员可以根据需要构造自己的数据结构。它相当于C/C++中的结构类型(structure)。在VB中,允许程序员以传址的方式将自定义数据类型参数传入动态库,DLL过程也可以将修改后的参数返回VB程序。但是,在VB中仍然不支持以传值的方式传递用户自定义类型参数。

  传递用户自定义类型参数时,必须确保VB中的数据类型的成员与动态库中的结构成员是一一对应的,所占空间也必须严格一致。这里所说的一一对应,不仅是指VB 中的所有结构成员在动态库的结构中都必须有对应的元素,而且它们在数据结构中定义的顺序也必须严格一致,这是VB中使用的"数据结构成员对齐方式"决定的。在VB 中,数据结构使用双字对齐方式(4-byte alignment),因此,在用户自己生成用于VB 调用的动态连接库时,也必须把编译选项"structure member alignment" 设为4字节(如前文所述)。

  所谓结构成员对齐方式是指一个数据结构内部,其成员的排列方式。譬如,在VB中,其对齐方式是4字节,这就好象在一个数据结构内部分成了很多个4字节大小的小单元,如果相邻 两个或多个数据成员的大小可以放在一个单元中,那么就放在一起;否则这些小单元中可能 会出现未用的空字节。我们来看下面一个数据类型:


Type TestType
m1 as Integer
m2 as Byte
m3 as Long
End Type


  它的三个成员的大小加起来是2+1+4=7。但是,由于m1和m2的字节总长度是3,小于4,它 们就存放于一个单元中;但该单元剩下的一个字节不足以放下一个Long型的成员m3,于是m3 就被放在下一个单元中,它们之间就有了一个未用的空字节;因此,整个结构所占实际长度是8 字节。同理,如果将m3和m2的位置交换一下,它所占的尺寸就变成了9字节。可见,成员在结构 中的声明顺序也是非常重要的。

  通常,当一个用户自定义类型中不包含字符串时,向动态连接库中传递该类型的参数是没有什么问题的。如果只传递一个自定义类型变量,则既可以传递该变量名,也可以传递该变 量的第一个成员,它们的效果是一样的,都是将该变量的地址传进了动态库;同样,如果要传递一个自定义类型的数组,则既可以传递该数组的第一个元素,也可以传递第一个元素的第一个成员。但是,如果用户自定义类型中包含字符串类型时,又该如何与动态连接库传递参数呢?答案是令人遗憾的:在VB中,你无法将一个包含字符串成员的用户自定义类型变量或数 组安全、正确地传入动态库中。如果你这样做了,即使某次侥幸得到了正确的结果,在其背后也隐藏着许多致命的危险。因此,如果一定要在用户自定义类型中包含字符串变量,并且该类型的变量又要作为参数传入动态库时,你最好修改类型定义,把其中的字符串成员用相应的字节数组类型替换掉(转换方法可参见前文),这样就可以在VB 和动态库间传递这种类型的参数了。

  另外,在VB 中还可以把一个函数的指针传递到动态库中,方法也并不复杂。但笔者强烈建议最好不要这么做,因为这样一来VB 应用程序就几乎完全丧失了它所应有的安全性。如果 确实需要传递函数指针的话,那么还是编一个C/C++ 的程序来完成这项工作吧。

  总之,在VB中调用DLL过程是一个比较复杂的问题,编程人员必须很好地把握,才能达到既提高了程序效率,开拓了程序功能,又不降低程序安全性的目的。另外需要特别指出的一点是,在本文中提到的所有动态连接库,都是指没有使用自动化(OLE Automation)技术的动态库,Windows API和大多数用户自编的动态连接库都是这种类型的。对于使用了OLE Automation技术的动态连接库,其参数传递的方式有所不同,读者可以参阅有关OLE 技术的书籍,在此不再涉及。



个人觉得比较有用,贴出来与大家分享!

2006-07-26 15:45
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-26 19:16
smallpuppy
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-7-25
得分:0 
因为在VB中,我的自定义类型中有字符串的存在,就像我贴出来的文章中写的一样:“在VB中,你无法将一个包含字符串成员的用户自定义类型变量或数 组安全、正确地传入动态库中。”

这个因素的存在干扰很大,最后我就将字符串部分删除了,尽管可以计算出结果,但也不完善了,还是不理想
2006-07-26 20:07
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-26 23:12
smallpuppy
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-7-25
得分:0 

我的VC结构体中的字符串是代表时间的变量

因为一直出现错误,我就把时间部分注释掉了

余下的其他部分可以进行计算

但是少了时间

2006-07-27 09:19
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-27 17:04
yeshirow
Rank: 4
等 级:贵宾
威 望:10
帖 子:854
专家分:0
注 册:2006-6-8
得分:0 
可以在 VC 中使用 VARIANT, 在 VB 調用時傳入 Variant 類型的數據就可以了

在 VB 中定義的結構 (Type 定義的)和在 DLL 中定義的 C 結構應該有一樣的大小, 可以通過在這兩個結構中強制一個嚴格相應的成員的一對一隊列來實現. 因爲 VB 會壓縮用戶自定義的類型到一個四字元邊界 (DWORD), 這是問題的根源.
在 VC 建立由 VB 使用的結構時, 在 Project Settings 中設置 Struct Member Alignment 爲 4 就可以了.

如果要在一個結構中使用一個 String 類型的變數, 可以考慮使用 BSTR 類型,
例如
typedef struct tagMyStruct
{
BSTR vlstr; // 變長的字元串
char fstr[STRSIZE]; // 定長的字元串
} MyStruct, * LPMYSTRUCT;

但在 VC 處理中需要處理一下 BSTR, 詳細信息請到 MSDN 參考一下 SysStringByteLength, SysAllocStringByteLen 和 SysFreeString 函數 (ole2.h 文件中有聲明, #include <ole2.h>)

在 VB 中的聲明就可以是
Type MyStruct
vlstr As String
fstr As String * STRSIZE
End Type

原來朋友仔感情再天真, 亦是我永遠也會愛惜的人, 明日愛他人, 也記住學會不要緊; 原來朋友比戀人更高分, 亦讓我開始懂得不記恨, 若大家都敏感, 我更要永遠記得拒絕再因小事怪人, 爲何沒有這條校訓...Twins-朋友仔 MCSD Training
2006-07-28 02:14



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-80190-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.866144 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved