|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑 $ }) i5 ], @" h4 n
" s; q/ s6 k/ \$ X2 u' i2 B4 Y s4 Y% [: S
以下内容转载来的 部分亲测 部分未测试
6 D6 f8 a- B7 M2 j
( Q$ m7 [9 {2 A* }5 [& K- d' f+ @& k7 O. X
8 z5 B) n) P8 \; C) L0 b
VB调用C DLL时的参数传递
$ G4 X* y! H( b) k% B) Q X; Y4 c5 N8 i4 ]0 J0 [) g, l$ G) W6 f
函数在C中的原型,参数类型和传递方式 对应关系 9 b _9 o, D. e9 y# W
% e3 Z9 n2 l! U5 u) n1 p
+ [' V b; n ^
, d$ H2 D, I U( ^6 B- hC DLL 原型 VB声明 VB调用
/ H- V8 h, ^+ A. \& J% o& |! Z, I" g. d! I# R8 @( b
USHORT a ByVal a as long Call func(…,a,…)
! s- [9 l) w" m! m1 a6 L! @
0 K7 ?) Q# { wint a ByVal a as long Call func(…,a,…)
; x) Z+ ?# m* P0 N
! D( G v& @2 p' z' u' `. dlong a ByRef a as long Call func(…,byval a,…)2 g9 v |, Q, {; y' _
" u5 F+ n4 K( i: n7 e, Z( Zint *pa ByRef pa as long Call func(…,pa,…)% d/ |: g5 q+ {5 I# W0 S
8 A" ~* G6 ?& _$ p3 j4 Jlong *pa ByVal pa as long Call func(…,varptr(pa),…) <---------(1)" O& R# G4 T% L& K9 @
& o( B4 C5 L0 [& B3 mLPSTR lpStr ByVal lpStr as string Call func(…,lpStr,…)9 c3 E9 T' y' Q5 q2 U
& f# M3 K( _+ N9 J4 Gchar *pstr ByVal pstr as string Call func(…,pstr,…) <---------(2)
; P) Y& Q3 l& n
9 y! J. H# Z9 x5 V& Awchar *pstr ByRef pstr as string Call func(…,byval pstr,…)6 C0 d4 K7 X7 }. [, p" M- P7 f
4 p3 m: Y; n r, ?0 C+ e' bstruct tagX *p ByRef p as tagX Call func(…,ptag,…) <---------(3)
% f( l, {9 }% N* r+ n' V3 \/ d5 W% F
HANDLE h ByVal h as long Call func(…,h,…) <---------(4)
, |+ n# e7 z2 E& C# P& ^4 l3 f8 [) b w! j9 u
备注 : t9 K' h# q3 V' f5 w
8 X, Z% u& \3 T( W1)不推荐使用此方式
* y! @, ?1 h8 {3 M7 M% g5 W K9 S# ~. S+ P/ Q- d! s8 x
2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50
3 y0 u ^' l- V2 A: ]% D3 f7 s. r' H1 ^$ C- v& H
3)用户定义子类型必须用ByRef方式传递, / @0 s8 c6 B% V& h
- B) c+ ]* z+ s3 M; R+ O/ C1 U7 \
4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。
# i S- d$ D; P4 \6 C$ S) ^" l7 |! G& v
5 L* {6 O2 o* c/ I4 [' l
8 \' w# I% p- i8 N- w4 A1 d0 J( N8 {0 Q
9 d5 w; A9 P( L8 E, z( j" ]; s- Q1 H- p7 g) h% _
9 Y% z# I$ _9 V# k7 O2 ~
) ]. a. P' j2 T6 {4 ^数组传递 5 ^( e# d2 @7 _6 g r
2 H9 e) k0 U- S# f, U, T 数组传递值用ByRef+ m& ?: O$ e& |/ N- j+ J4 s& A$ t
+ Y% b K; S E4 t+ j4 a4 Z8 N- w
VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。0 C2 K$ E1 x% l/ D
( B9 a j2 V4 R! K0 i" M; g4 m
" h( d, i6 ~7 O! Q
: ^; `' Y9 [# h+ M- X c& f
VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。# X; H6 f3 j4 ?" L: u0 I7 V
1 z& ^" H5 ^/ g( m- A$ D" T" [
1 O7 e+ f1 L" _9 z) o' e& F# ^4 s0 n
( }( G" v9 u. R1 v
& Y8 E2 h1 ?8 ~7 D
dll函数直接返回字符串
5 ^$ K9 y0 T7 h* |
' q$ S+ `" c7 U8 W" Q
" I. U" p- K5 y
& P( a2 D i/ b9 ?! G& l6 w4 { VB下的字符串格式和VC中的char有些不同的, C5 c. y4 Y. |( }) E0 e" t# `8 d
7 e5 b) ]# O: S9 ~/ s
直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子:
4 ^! P; q/ n3 P' M
2 u4 P6 f" U) X: y) O! @
/ @& F g) E% U; T/ a. x! t8 x% ]! o* i" t8 z) F6 \8 c
EXTERN_C BSTR WINAPI RetStr()
. f4 L5 r5 n2 z' |
/ q/ e) G. [/ q. p/ J { 3 E. b/ o1 C m3 p+ N; P
8 F5 L3 g1 g i. L8 x
char *str = "1234567890";
0 }" r) C% j# U: Q
6 J7 @7 v: f3 T/ w return SysAllocString((BSTR)str);% K) o2 O0 Y) S) P5 |
$ K5 V/ K2 _6 P. _6 | } 5 S1 E" T2 K; K/ n1 r, w
" _- J! u( L0 X9 B+ W* [, S2 K( h或者参考一下VB下调用GeTComputerName的方法.. r9 c5 V& m' h. j: u9 c
" m- ]+ ] Z& P; v) [ w+ T9 p! H1 l: R+ Q. }, n6 ~
1 w9 N- H+ g ]7 I7 U7 m0 a' F+ {& j3 x2 m( T# \1 \3 D
( ?1 e' n3 _- L* p" k& w9 I F
VC++与VB数据类型对应关系
. l5 E: x7 ?$ W! i, k( B: P/ F6 u0 x9 g+ `# l( w+ t
VC++ VB0 J# ]: Q6 k; Y
short Integer2 t4 ?2 ~7 Q. t) C# {' n
int Long
+ }2 p# [2 `. M% D+ }long Long
" o6 k$ [2 |9 O& x2 I+ w9 RUNIT Long
* E. h1 L/ ^4 n/ _" ~$ \+ a$ TULONG Long
: u2 ^! V2 B# J, c! tWORD DWORDLong2 A7 u/ k; \7 n; O
WPARAM LPARAMLong$ f5 V( ]! g) o, q
WMSG UMSGLong
* y& U& p6 }) sHRESULT Long* I, R2 H: F1 X% @+ O8 b+ I
BOOL Boolean
7 p# H4 l0 k0 g; \, qCOLORREF Long1 k4 t! I0 w- z$ y- A2 f. V* M' |$ d
HWND,HDC,HBRUSH,HKEY,等等 Long
[1 c+ }! n' dLPSTR LPCSTRString, Y& B7 B0 ~( q0 v7 }4 Q
LPWSTR,OLECHARBSTR String
+ P4 V4 k% R! s% c' ?LPTSTR String/ V( s) @0 Z, }0 M; x9 n5 D' w
VARIANT_BOOL Boolean' I/ p! H. e2 I# P/ j; G5 o
unsignedchar Byte+ q: e# O& ~8 H: r# ?
BYTE Byte
/ r6 O/ l6 d3 l# R9 w) OVARIANTVariant
, Y- d2 k+ H6 i) R' @! ^# z7 n(任何以*或**结尾的数据类型) Long# g( K8 V; |; ^( U: q6 V: A4 ] B7 u
, y9 z8 ^, F9 V: M! ]6 t5 E) k3 N. e% I% b' E$ k7 \
c中的数据类型 VB中的声明 结果9 Q1 p: T2 [. K7 U4 K3 G" M3 |6 t! H
' O3 M# V2 j9 N. o5 N+ s
ATOM ByVal variable As Integer 结果为Integer 类型的表达式
: Z; c; x7 n J2 b1 r2 \BOOL ByVal variable As Boolean 结果为 Long 类型的表达式
' V9 z0 n+ [! z RBYTE ByVal variable As Byte 结果为 Byte 类型的表达式 " Q% M9 N0 w0 Y% x0 E
CHAR ByVal variable As Byte 结果为 Byte 类型的表达式
; g. ^( \4 M7 ~! GCOLORREF ByVal variable As Long 结果为 Long 类型的表达式 ( m' p9 g9 G4 D7 H& J/ i
DWORD ByVal variable As Long 结果为 Long 类型的表达式
$ t+ }% s( _& t4 rHWND, HDC, HMENU ByVal variable As Long 结果为 Long 类型的表达式等Windows 句柄
. u3 ?+ W! [9 Z* ^* e, ?INT, UINT ByVal variable As Long 结果为 Long 类型的表达式
7 j6 l# Z, b7 E( v K1 W) rLONG ByVal variable As Long 结果为 Long 类型的表达式
8 p$ y( I" [4 g4 G. q! ?/ w7 JLPARAM ByVal variable As Long 结果为 Long 类型的表达式
) M8 h) `, z' ~8 kLPDWORD variable As Long 结果为 Long 类型的表达式
! p- w' N6 i9 G0 pLPINT, LPUINT variable As Long 结果为 Long 类型的表达式
! ]$ L0 T8 H1 |; @LPRECT variable As type 自定义类型的任意变量 , e, [8 F$ b. x: J& ~+ f. [9 L
LPSTR, LPCSTR ByVal variable As String 结果为 String 类型的表达式 ) s0 }8 { J$ Z T4 C' M
LPVOID variable As Any 任何变量(在传递字符串的时候使用ByVal)
# w2 S- n- a- hLPWORD variable As Integer 结果为Integer 类型的表达式 5 J3 U! [7 [% K0 B% @: C
LRESULT ByVal variable As Long 结果为 Long 类型的表达式 ) w7 |8 u |+ v
NULL As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer 结果为Integer 类型的表达式
, D1 C3 {# g6 ?1 AVOID Sub procedure 不可用
0 P2 b5 T& i8 o9 l5 g) iWORD ByVal variable As Integer 结果为Integer 类型的表达式
7 p2 b/ j- }' X' w# j# kWPARAM ByVal variable As Long6 ^( J- j3 C- W/ S' p" z4 C' A
' y+ O5 p6 y9 B4 N: H9 ^
|
|