用户自定义类型(User-defined Type)参数的传递
用戶自定義類型(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字節??梢?#xff0c;成員在結構 ? 中的聲明順序也是非常重要的。 ?
? ?
? 通常,當一個用戶自定義類型中不包含字符串時,向動態連接庫中傳遞該類型的參數是沒有什么問題的。如果只傳遞一個自定義類型變量,則既可以傳遞該變量名,也可以傳遞該變 ? 量的第一個成員,它們的效果是一樣的,都是將該變量的地址傳進了動態庫;同樣,如果要傳遞一個自定義類型的數組,則既可以傳遞該數組的第一個元素,也可以傳遞第一個元素的第一個成員。但是,如果用戶自定義類型中包含字符串類型時,又該如何與動態連接庫傳遞參數呢?答案是令人遺憾的:在VB中,你無法將一個包含字符串成員的用戶自定義類型變量或數 ? 組安全、正確地傳入動態庫中。如果你這樣做了,即使某次僥幸得到了正確的結果,在其背后也隱藏著許多致命的危險。因此,如果一定要在用戶自定義類型中包含字符串變量,并且該類型的變量又要作為參數傳入動態庫時,你最好修改類型定義,把其中的字符串成員用相應的字節數組類型替換掉(轉換方法可參見前文),這樣就可以在VB ? 和動態庫間傳遞這種類型的參數了。 ?
? ?
? 另外,在VB ? 中還可以把一個函數的指針傳遞到動態庫中,方法也并不復雜。但筆者強烈建議最好不要這么做,因為這樣一來VB ? 應用程序就幾乎完全喪失了它所應有的安全性。如果 ? 確實需要傳遞函數指針的話,那么還是編一個C/C++ ? 的程序來完成這項工作吧。 ?
? ?
? 總之,在VB中調用DLL過程是一個比較復雜的問題,編程人員必須很好地把握,才能達到既提高了程序效率,開拓了程序功能,又不降低程序安全性的目的。另外需要特別指出的一點是,在本文中提到的所有動態連接庫,都是指沒有使用自動化(OLE ? Automation)技術的動態庫,Windows ? API和大多數用戶自編的動態連接庫都是這種類型的。對于使用了OLE ? Automation技術的動態連接庫,其參數傳遞的方式有所不同,讀者可以參閱有關OLE ? 技術的書籍,在此不再涉及。
總結
以上是生活随笔為你收集整理的用户自定义类型(User-defined Type)参数的传递的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用对齐原则求结构体长度
- 下一篇: 在VB 中调用动态连接库