|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑
& m1 x) `( W- J3 s
& i0 F' z' T9 _0 K: D8 x; M% c4 K1 x3 n3 i+ X4 t' i# M
以下内容转载来的 部分亲测 部分未测试
) u5 i- u* F5 y( `4 V( z* a; g c* J( c" c& B
. p* j |; t# Q) N1 H7 i) V& i% _' C9 F9 {7 ?6 d- G1 U3 D
VB调用C DLL时的参数传递
2 ^" I4 n0 r9 H' u, \' W& ?2 E s6 p
函数在C中的原型,参数类型和传递方式 对应关系
. t8 l& t" m0 Y O2 J. N5 n9 P2 `- e5 s; l* p- f
& [; Y' o% T- A& A! O8 j
6 h& n w, n+ b6 q9 u: w& N2 w6 \C DLL 原型 VB声明 VB调用- x5 w" z \2 H5 d( Y6 ~! h8 u& H1 }
3 s0 ]6 Z s) U5 J+ @7 uUSHORT a ByVal a as long Call func(…,a,…)
. ^- d7 I& }: m) k5 U: g% U& c$ p, s9 {( z3 @3 T! }4 W
int a ByVal a as long Call func(…,a,…)
" o" t! j" u, ^2 \
/ t. Y/ l# A+ z: _4 }" clong a ByRef a as long Call func(…,byval a,…)
; ?9 J# k& P: s" n" k
1 M. Y5 Z! D6 ~5 U& b3 o9 E# wint *pa ByRef pa as long Call func(…,pa,…)
& Q4 i& D+ X& [. A0 S) }: A
# @1 v% q7 |/ @: |- tlong *pa ByVal pa as long Call func(…,varptr(pa),…) <---------(1)
6 E+ M7 \! z, [$ a m" x# S4 ~2 I+ L/ `: f5 W X
LPSTR lpStr ByVal lpStr as string Call func(…,lpStr,…)- O% B' T5 _& d1 z" i9 h' L3 K
7 G+ v. m0 N+ K4 S+ W6 V2 G, wchar *pstr ByVal pstr as string Call func(…,pstr,…) <---------(2)
- q, E1 G9 \$ E- M- e" U. t) N U2 _6 r- g1 X; F7 L
wchar *pstr ByRef pstr as string Call func(…,byval pstr,…)5 _/ X; @8 g! s8 x. W6 H
& ^6 a* H$ O/ D+ B' O; ^- Z3 h" sstruct tagX *p ByRef p as tagX Call func(…,ptag,…) <---------(3) 0 i2 A6 x, f% X7 \# k, [, b
3 g3 L1 y5 ^. {8 p3 N2 o
HANDLE h ByVal h as long Call func(…,h,…) <---------(4) " u. w1 B5 p# \* R8 k% a1 j b
! i& x! l+ l8 d5 [备注 5 \: `4 X9 n& b7 `8 \
! ]* n8 `! u: V5 K0 Z1)不推荐使用此方式
3 p! u6 j6 ^) `2 V% B. A; @+ u, l8 V5 b# r9 Z
2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50
2 D. z1 }+ t' M, S8 ]/ g `) L
|4 {' W% Z; R, d( l2 x3)用户定义子类型必须用ByRef方式传递, # e+ I4 n3 q9 V& t
5 l/ i2 ]1 L- ]4 ~( f4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。
6 \7 T ?: P$ x. Z/ V( t
( `* p$ O% w( W: `' j1 n9 A* b% J1 h4 g7 }2 B
( W2 ?7 B! p7 V. Q; B
2 W2 l( r9 [& t, b6 l& m
: g# U" S$ @- Z& U" m* x5 `
7 i, {: ]2 m. x% n5 ^ N* B" C9 ^6 S5 W
数组传递
1 z( X+ Y( Q( Q1 ]% V7 u6 d+ j! I7 Y/ U: v8 S; b" Y- I
数组传递值用ByRef1 h$ b8 r0 G' [, z2 U9 C% ?. h' f
1 W8 z. _+ R* X1 @4 _0 g- Z2 b* ~
VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。
* v0 @0 a1 p1 P" a1 R e. h2 l
( [- H% T. _+ U2 K% e. `2 ~# T
4 R# V u4 H7 v
VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
% p$ G; r# t" ~3 [# N" b' y, G/ R+ }. k, w$ e0 h2 M
* {3 x* @3 S! J" p) B' n" L) l
) G) y8 Y% \8 b! d# f
! O# n, C3 J9 _: K# ]/ Q, a R# c2 q6 T1 F7 @
dll函数直接返回字符串
; Y' A9 L( x! U* T, i, D
$ a% P$ v( @$ G3 E# [4 G4 e7 E, u! v# N6 {2 ^
- Q2 R& N. P8 m8 T, B0 i: C
VB下的字符串格式和VC中的char有些不同的
- [9 z( w( k7 ^; V7 V% U! Z9 A$ [4 }- \1 q: q, y
直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子: 5 s" e" U8 T" t2 ~) f' o2 l
0 @9 `, @( m6 L- R
% c! s- C/ i3 }
' M- e% A' r6 U1 ]( x( j1 c
EXTERN_C BSTR WINAPI RetStr()
0 F% U9 \2 c& t( e1 R8 w" `* a& |& ?! j. A; n
{ 6 P% E% P0 e6 S, y. F" r5 K
9 W+ B9 L1 r4 q% j char *str = "1234567890";
; w! [! ?2 }2 W. x
& f' D, B: ^. i* t, h% \8 D$ F" F return SysAllocString((BSTR)str);
; m* f( u) O6 T9 y, p7 b$ a# K. n N
}
! _6 _6 ?% {! q
7 J1 x# R H+ ~或者参考一下VB下调用GeTComputerName的方法.( K) R; A6 R( x- Q
: E$ w% G9 W& {6 j6 ]$ R) q4 x
; q* c3 ]: p( ^; v+ E4 }& U o: x, E. d, ^7 d
0 Y+ [! |0 f5 J; [7 c. y
3 ~7 V; O; ?9 b+ q VC++与VB数据类型对应关系, N8 r( R$ F a7 g( h6 I% j
) n8 _) ], p# \
VC++ VB7 ]3 s3 @8 d% Y. y( b" A
short Integer
0 Z$ `4 j7 D( rint Long8 E4 L6 J( P, v9 A1 a: B
long Long
% R0 h$ [+ n& u$ o* j. T" uUNIT Long3 d6 P& ]5 S$ t2 M0 S. F2 r# z! Q
ULONG Long
1 E/ Z4 m- c$ @WORD DWORDLong
9 _: U5 p( Q/ C5 `7 j$ kWPARAM LPARAMLong
; o( [/ Q) ]& o9 tWMSG UMSGLong$ ^8 D8 Y% V/ ]( C
HRESULT Long
% Q) h0 ^+ Q4 D" J, J6 Y7 jBOOL Boolean
- J4 u5 \( R, S$ }1 f# s3 xCOLORREF Long
. o: ], |3 t+ h7 w) C* R: t4 {: iHWND,HDC,HBRUSH,HKEY,等等 Long
9 f7 b4 S/ j2 E5 p% DLPSTR LPCSTRString2 x" |, k5 L6 j; F
LPWSTR,OLECHARBSTR String
, n: {. k o! @. |LPTSTR String
. x7 p6 S, c: A- _% s6 h* GVARIANT_BOOL Boolean9 q0 s/ J3 {$ s5 k, N/ N; X5 m, l5 x
unsignedchar Byte
& a& |" X$ Y! @5 mBYTE Byte. r) D5 n2 Y3 K: q- Q) j# o
VARIANTVariant
( V1 {+ q: \# d/ T) d& p! T, M(任何以*或**结尾的数据类型) Long6 Y6 l. D9 u$ ^' {
4 C! x" M; _5 |
! [; R! n% q' E4 B) Mc中的数据类型 VB中的声明 结果2 P' }, g* k$ C* t! p
; r/ a0 u: k& f8 u% RATOM ByVal variable As Integer 结果为Integer 类型的表达式
, \$ d$ |( l3 x2 y, a4 N8 mBOOL ByVal variable As Boolean 结果为 Long 类型的表达式 4 D% _! \/ u7 o6 ?/ C
BYTE ByVal variable As Byte 结果为 Byte 类型的表达式
- \2 K, C, m$ k( M$ [+ I+ G( A! `CHAR ByVal variable As Byte 结果为 Byte 类型的表达式 ; Q- r8 C) o. ~# `8 U* G
COLORREF ByVal variable As Long 结果为 Long 类型的表达式 ) i( d% g8 o/ z( q. E$ o6 Q
DWORD ByVal variable As Long 结果为 Long 类型的表达式
Y7 P5 l) k" ^7 h4 M( R& Y3 pHWND, HDC, HMENU ByVal variable As Long 结果为 Long 类型的表达式等Windows 句柄
5 g6 C) S% _% l7 ?5 bINT, UINT ByVal variable As Long 结果为 Long 类型的表达式
0 k5 w Q- n ELONG ByVal variable As Long 结果为 Long 类型的表达式 . \4 e+ v E7 Q2 N
LPARAM ByVal variable As Long 结果为 Long 类型的表达式
; u w% x9 l# d- cLPDWORD variable As Long 结果为 Long 类型的表达式 2 ~$ Q4 a# u$ I1 W) {7 d
LPINT, LPUINT variable As Long 结果为 Long 类型的表达式
3 Z# U5 Q2 a/ F, `! [: TLPRECT variable As type 自定义类型的任意变量 " G) b) ^( m7 l! ]4 d
LPSTR, LPCSTR ByVal variable As String 结果为 String 类型的表达式 * A5 S! Y. ? j- V
LPVOID variable As Any 任何变量(在传递字符串的时候使用ByVal)
! t# l+ ?8 y- NLPWORD variable As Integer 结果为Integer 类型的表达式 2 D: r3 H8 e0 [" ?
LRESULT ByVal variable As Long 结果为 Long 类型的表达式
6 S& y* g* ^( _- \, nNULL As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer 结果为Integer 类型的表达式
2 }0 F# ^, r# w0 vVOID Sub procedure 不可用
" y* A+ m# Z, o6 F, y) C& wWORD ByVal variable As Integer 结果为Integer 类型的表达式
& |0 z ]% C* Y/ j4 M& S' _WPARAM ByVal variable As Long6 a9 c. i3 z7 Y. K9 p" t( {
+ M! z* s4 `$ @" B- D% h1 }+ q _ |
|