|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑
# d1 D% J: T- V4 |$ F& |3 L) Z' f5 G$ H6 T
5 `. X+ s) Y7 Z4 r以下内容转载来的 部分亲测 部分未测试
" `: d* U5 ~! k0 |- E$ P% h( M% e+ m# \/ w
; m0 q% t9 U( p4 P+ }
+ E% k' n- T. }2 M" T
VB调用C DLL时的参数传递, `0 C6 B, f3 Y8 A0 z
& D( Z3 I$ B* n& P3 v$ E函数在C中的原型,参数类型和传递方式 对应关系
}/ ~9 J/ G" w4 n0 C2 h) B! a
0 k' }) d( |& W/ W
) f" h6 Z7 c) I# J( k: C7 jC DLL 原型 VB声明 VB调用" c7 R5 |' H3 \& B+ w% u$ U% [
: |) u, }4 S1 \6 d& \% V7 P
USHORT a ByVal a as long Call func(…,a,…)0 r2 v5 Q0 E" |9 I; L% O
( S) O. x8 R; e2 ^int a ByVal a as long Call func(…,a,…)0 j9 T/ ?6 W5 v
+ ^) Z% \: G! s6 \long a ByRef a as long Call func(…,byval a,…): `3 i- D% ]4 ~/ `6 J
1 T& x# z! A( K
int *pa ByRef pa as long Call func(…,pa,…)/ M7 Q- q' `6 B7 Z$ g9 }
; J4 R) \' r. X! llong *pa ByVal pa as long Call func(…,varptr(pa),…) <---------(1)
# f- d# v1 m4 j( q, i+ n S' N. S# o$ @6 N' S) ] U/ A
LPSTR lpStr ByVal lpStr as string Call func(…,lpStr,…)& {1 {/ K3 K1 n3 ]5 J# v7 h( U0 K
$ b. c+ ]6 f3 F5 Bchar *pstr ByVal pstr as string Call func(…,pstr,…) <---------(2)
- g# ~' d- P7 K; w$ ?% b C* K M7 y( m" Q" y
wchar *pstr ByRef pstr as string Call func(…,byval pstr,…)
6 I4 K g2 u" a9 l
7 p; T" l3 h& p$ \% m. astruct tagX *p ByRef p as tagX Call func(…,ptag,…) <---------(3) / f4 _/ a' O! Q) _! x, M
1 o5 \4 e4 r+ u/ h/ J) G; e+ zHANDLE h ByVal h as long Call func(…,h,…) <---------(4)
~9 ^: g) J4 u8 |
{ g( @1 H; ?备注
/ X g7 z) L$ Z% ?5 a$ V8 T1 _1 [+ B: h0 H* a! H2 ~
1)不推荐使用此方式
; V) b+ r4 b% m/ f! Y
7 O; ?7 T8 w# {3 p( T f2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50 B5 ^6 Z( t+ M$ K/ D
9 n. E; e4 O) d6 i8 J3)用户定义子类型必须用ByRef方式传递,
. i$ l/ U1 {* U; f& H$ z; o
( X5 K& P0 | w1 O, V; p% Q7 i4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。
( n! R& c3 Y* v
! x! G" P2 d8 ]1 a; B% w9 N8 |* `( T* c( H; T% l
: s4 c8 L! h- A* Q1 [; ?9 |% ]
3 T" T( Y/ q9 I* o, v; m! I. K+ ^( ^- K& A& A
* S2 Z0 k7 H# u# D4 V% X& q( j U" z' f& d2 y0 B; v
数组传递
' x+ ?) |* P' z) m6 g' u( F
) [5 ]1 V- i8 d9 l4 z. Y+ A 数组传递值用ByRef% t/ z7 M$ q3 F6 V) n
# m+ C1 {7 [2 Q3 C* S
VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。7 x2 ?0 N; l8 \" K! Z; x; W" r7 }
* j5 U. C* Q+ ?' G8 U8 G
3 ] O* ~# @7 Y5 P& s
4 ^$ @% w3 K2 ]/ t
VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。) K8 E; Y* }( w! W2 t; ~
' r7 p2 S) l5 @6 U# \, q
: O* ]- i- ]- d8 Y6 l1 \! S6 e# U' p, @. J+ _" k5 N3 e
" X3 k" i6 i' `( ?
6 Y Q4 X& `8 {# W% Q
dll函数直接返回字符串
1 i3 V0 Z& u, b, P/ R$ S9 y \. Z6 }. Y- |
& |$ O' [) A- ?, [9 Q/ I5 l, h6 D
/ L. V( _4 a) I7 f/ e! i VB下的字符串格式和VC中的char有些不同的
( t; O; S: q" a* `
- y6 V% F4 U& t7 e' W3 M 直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子:
6 S7 Y' E' b- h9 R0 M) f, a* ]3 `
/ S$ D! y7 ?' o, _3 I" m
" r( I }+ C8 V" q ~9 W EXTERN_C BSTR WINAPI RetStr() 6 `- g4 J& ]' E( z X9 t/ F5 H
# g/ }* `/ R' d, }' V! Q { 9 v9 j4 Y% @) V6 Q
5 t9 s0 D; F/ \) a8 k
char *str = "1234567890";
9 w- c0 I- L0 N6 H s
% w3 y1 K" A. c/ v) n5 J return SysAllocString((BSTR)str);) k" b. h& A5 D: @$ m% c7 Y
7 ^% y/ n% |( m8 y: h
}
- D+ q+ _2 t* w2 {" ^% J% B* m" N
' ?! e) |3 ?8 d8 ~3 _% d. K或者参考一下VB下调用GeTComputerName的方法.4 \2 A6 W9 m' L6 R& \; w2 s. B+ k
7 G; n) {/ m% E" G3 y% v% }* r- q* T* W g* ~
+ a2 l0 @0 I& V" R1 `
' H* ^4 G8 u. h- v" i5 N2 v: S$ L" Z1 Y7 I" b4 T
VC++与VB数据类型对应关系! Y' M4 c- F0 W v6 E1 T
" z- n' D- A+ U( b/ J' {VC++ VB
; ]* G6 \2 [1 f5 ~8 S; c7 R9 ^short Integer, D0 e0 [3 _ A, |
int Long
- ?& a r ^" W7 Clong Long8 Y6 {# A5 U% t+ V$ g
UNIT Long
$ S) K' @# z2 ^+ p& f) dULONG Long! X+ G% \% N% {2 U3 b
WORD DWORDLong
# T% r( d$ s% x6 rWPARAM LPARAMLong
: r3 ~% v3 V2 h' iWMSG UMSGLong
* l- G Y/ E# @. ~HRESULT Long9 [8 ]6 Z: F$ F2 s& I8 h
BOOL Boolean+ W k" w- q# {
COLORREF Long$ D& c: _6 A x6 A, X1 Y- c
HWND,HDC,HBRUSH,HKEY,等等 Long4 f6 g6 T1 m# F- y" x% A- w
LPSTR LPCSTRString
& b* F6 ?# t; z6 [$ MLPWSTR,OLECHARBSTR String
7 k0 ]/ z V! f( |7 CLPTSTR String" o8 x( _' E: e4 ^7 f7 T
VARIANT_BOOL Boolean
" g( k; u# B( P' ~# P; l uunsignedchar Byte5 D* Z) l* e" m! ?# }7 n
BYTE Byte
3 L# o: i0 p( Q, M& D( N5 F. lVARIANTVariant
2 c( u# ?& e% K$ n: N6 G, q(任何以*或**结尾的数据类型) Long8 P/ a7 C# w1 r9 ~7 i( t) Y5 W8 I1 l
8 S$ m- t. L# C: ~: _
D. [/ F# Z& E; R* hc中的数据类型 VB中的声明 结果! s! F- x7 Y6 K3 Q8 j. `
* {+ _ d. U6 PATOM ByVal variable As Integer 结果为Integer 类型的表达式 . K- ^( k w9 s; M
BOOL ByVal variable As Boolean 结果为 Long 类型的表达式 : c: c, R$ _4 n% R, h! q) D! q
BYTE ByVal variable As Byte 结果为 Byte 类型的表达式 9 X' x6 l$ V6 B! P' H
CHAR ByVal variable As Byte 结果为 Byte 类型的表达式
" n& ]0 f4 ?7 D! \! ~ {COLORREF ByVal variable As Long 结果为 Long 类型的表达式 6 F- S8 `& m* y* X. l3 {2 O
DWORD ByVal variable As Long 结果为 Long 类型的表达式 % ~3 U/ b8 ?8 p" B8 @
HWND, HDC, HMENU ByVal variable As Long 结果为 Long 类型的表达式等Windows 句柄 + Y5 m* c0 F& x0 [
INT, UINT ByVal variable As Long 结果为 Long 类型的表达式 & x0 H6 ^$ \$ f/ w% k8 J2 }
LONG ByVal variable As Long 结果为 Long 类型的表达式
3 ]+ G2 k% A% N* b9 KLPARAM ByVal variable As Long 结果为 Long 类型的表达式 ) E5 v! S4 {" X9 F* D
LPDWORD variable As Long 结果为 Long 类型的表达式
* O6 R1 a# I, T' q- [2 vLPINT, LPUINT variable As Long 结果为 Long 类型的表达式
8 `8 `0 Z p% P: q: X0 \$ D9 n! QLPRECT variable As type 自定义类型的任意变量
9 i. c X& t+ p; Y( ELPSTR, LPCSTR ByVal variable As String 结果为 String 类型的表达式 - [! m, ~9 Z) _ @+ z
LPVOID variable As Any 任何变量(在传递字符串的时候使用ByVal)
4 N" t& r: K, w& BLPWORD variable As Integer 结果为Integer 类型的表达式
( i" e( ?* W$ f8 U7 [. q3 ~5 WLRESULT ByVal variable As Long 结果为 Long 类型的表达式
! g9 w( r: Y7 q9 I9 f% mNULL As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer 结果为Integer 类型的表达式
% N! f2 G+ f F9 c5 v- q* V( @; ~; l& HVOID Sub procedure 不可用
( |) M! X6 Z6 s) X( N$ D: m9 Y0 YWORD ByVal variable As Integer 结果为Integer 类型的表达式 5 p7 ] T% L5 ?5 z2 X" d" R0 y9 K) j
WPARAM ByVal variable As Long
9 h8 J6 q/ R2 C( l. B; B3 N( y; ^) |# x/ h- n8 m9 F) B
|
|