|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑
1 g' E; }/ E0 U. p7 F% D+ T; X' }, C0 [ o5 a( s* v
7 E0 U# V# A! R. F8 G" t* ^
以下内容转载来的 部分亲测 部分未测试
( J/ c/ }4 f' I# I. P) f1 a
& c6 X( ]7 V. H8 U$ h
) M5 w3 |+ u* y& V4 z D9 f8 i; @% s0 K( \( v% F
VB调用C DLL时的参数传递1 V$ P! y8 a% R% y& ^% u+ f
. d- x* _6 H6 A, c
函数在C中的原型,参数类型和传递方式 对应关系 + _, `# s: G8 C, e# p
9 R% _) H% d7 }3 Q* ^
2 V& B% k) M# `! S" J+ e& o" U2 @. j2 P; l% g
C DLL 原型 VB声明 VB调用
3 Q; U1 s. i3 C5 Y5 _% U a. H8 c. r# P6 k t5 a: [7 F7 g
USHORT a ByVal a as long Call func(…,a,…)
7 x. X% a! |( b5 {% s* w6 y3 z+ K# v; b/ b
int a ByVal a as long Call func(…,a,…)
5 }3 r! o4 S2 ]
. c* {1 ]3 O9 ~4 Y# nlong a ByRef a as long Call func(…,byval a,…)) @3 n) n# i2 j$ ]9 D9 w
0 n1 z# F- X t- Tint *pa ByRef pa as long Call func(…,pa,…)/ l! D9 C0 z8 P$ w: c, D3 u5 o3 m8 H% m
& i; G3 N$ e: C' Dlong *pa ByVal pa as long Call func(…,varptr(pa),…) <---------(1)1 e! _6 b+ I1 f% Y
; }; E2 ]0 [* o. Q4 w4 ULPSTR lpStr ByVal lpStr as string Call func(…,lpStr,…)
' u5 \ _. p5 k/ J, j
6 h+ D) O2 T: k; [# K( K/ |2 ]% ~% dchar *pstr ByVal pstr as string Call func(…,pstr,…) <---------(2)
- Y$ h* [# {" i {# L9 O; A. u
3 ^$ P; E$ n9 [( [: D$ {# F' i7 P- L* awchar *pstr ByRef pstr as string Call func(…,byval pstr,…)
3 Y2 t; L1 a0 s
' o L' X$ C4 J8 C4 pstruct tagX *p ByRef p as tagX Call func(…,ptag,…) <---------(3) $ ?& F% A. a8 O6 o9 I9 e( T% @
5 Q9 B9 z6 f6 @. C3 t$ M2 b7 ]HANDLE h ByVal h as long Call func(…,h,…) <---------(4) 4 E. I4 }" S$ r
! b0 C, s' f% e* ~& O
备注 , H! l& m Z' K* d7 b# y: O
9 h- D# M4 s `$ h, X! T3 [
1)不推荐使用此方式# {+ m* P7 z/ h/ {; c8 T
; V- p, @/ ^, Z2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50& V9 b: E# ?4 a) B4 L% q
+ G$ n- b# `2 ?5 R2 d6 ?! H
3)用户定义子类型必须用ByRef方式传递,
0 G7 D/ t5 X' p0 U1 g/ Q( v5 i. S: D0 m
4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。 1 Y- t" d# j+ p7 p# r
8 M& q, }& n, ^$ v) p6 n8 s' {0 b. b" H
/ k& W: ]) d5 G4 v3 ?
2 ]# R! f: ]9 H) t1 ^
" K1 L- b9 f$ }2 X0 w2 d. {5 O e* `4 K8 L5 R" H- [
) K/ F# C# Y1 P6 K4 {
数组传递
4 Y$ O S! D8 k5 d6 z) Q4 [* O% j7 |; {! m0 L! S% `- G E" Y& P
数组传递值用ByRef Q, {1 I8 v. {% O2 f
4 d9 @) H# B" ~7 z VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。
) s; _7 ^ A# p) H: G7 h$ C3 w- k8 A) Y( ^
! g6 P' B3 w, G6 I* y+ H: v7 S) f
6 [* g/ r1 F b; }8 G/ e$ \- Y: i2 N$ c VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。8 P! ~- y, x; {+ x6 d* t
) J. C% |: R* U7 H& e9 a) k( u! b& K4 d
) W3 {8 D. x! I
8 a5 F2 g* b- W- { |+ W7 K" c+ l
dll函数直接返回字符串
2 V; F1 Q: W; q; Z1 W- w5 a
7 H, a! w& t8 b* E+ V, j' e5 `& a1 @" A4 z) P# ?
: _/ V! x! T" i2 M0 E/ I( ^+ w
VB下的字符串格式和VC中的char有些不同的6 E: q! \% ?8 s' k
$ b& m* o% d- O7 _0 r
直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子: # x, ~4 G0 E! n: X. c
% C1 t$ D4 j* K3 F& r
+ W, _* H0 V( |; c+ R4 u( i! p
+ E8 E1 v4 H/ u: S$ ?; r. X- _ EXTERN_C BSTR WINAPI RetStr() 4 [, a8 N; N- `3 C
, R$ C% x; ~6 O' X6 Y- Z# e { # Q& M; k# @. |( {
+ d% E, |' I+ Y9 P4 N8 S char *str = "1234567890";
" o- |7 j3 v0 E6 } ~# H0 J2 `/ A5 o' x) G7 S' V" o8 z
return SysAllocString((BSTR)str);
- p9 ]; C1 g: C0 I
Z0 H, a6 L6 g" P# K* p }
8 |: d" n9 T: v* |4 b$ ?+ e
2 `! d/ B) b1 x. A) Z! D( ?% F或者参考一下VB下调用GeTComputerName的方法.$ \) L0 H2 U- a* i6 @% y
% C$ Y# O j5 ^0 T* @" Y; [ E6 N# k- N; J% n* F: W0 i& ^
9 Z7 m' ?# E) w# G" b+ O) Y9 S+ D9 S0 G
6 N" l1 d" p( x" q. l/ Y VC++与VB数据类型对应关系8 s" x: `" N) K1 S* q& }& l7 {1 y
" [6 |) l/ a1 K
VC++ VB
1 Y' P9 k4 c0 I. fshort Integer; G! Z+ j; h! d% V
int Long
+ ]' y0 r& U9 o) ]* Clong Long2 U7 \4 L( ^& `$ p L E
UNIT Long
" }' N, q/ F$ K5 \. c* kULONG Long# \2 p( B7 g; k% [" k7 U( l# w
WORD DWORDLong2 t: l5 w/ C7 v5 |/ f; ?7 P
WPARAM LPARAMLong$ h* u! J% J7 e9 \& a4 o
WMSG UMSGLong
8 k3 N; p8 e; z9 ^8 J0 }- ]HRESULT Long
: l2 \9 D+ n" h, I* j0 u3 kBOOL Boolean- m) ]# @- y0 k! R3 Q5 _; l9 p" S! Y
COLORREF Long
3 k1 g& A) L+ p4 s, OHWND,HDC,HBRUSH,HKEY,等等 Long' E& N2 I1 B1 C1 E8 |
LPSTR LPCSTRString8 \8 F) I7 V3 X
LPWSTR,OLECHARBSTR String
' P& P, R1 Q1 K3 MLPTSTR String
' h, A' r( c+ W8 QVARIANT_BOOL Boolean
$ q! g* K* e# g4 |: i2 runsignedchar Byte9 R/ V4 \, N5 ?& V+ d; a, \1 \
BYTE Byte( U" ^4 E9 g1 K! X2 t& w F
VARIANTVariant) z, v+ g9 I) K" b- W
(任何以*或**结尾的数据类型) Long
% z. H- I9 E+ M M0 A
6 m) O: C3 w" V5 _5 @1 R) |3 A5 z
c中的数据类型 VB中的声明 结果/ A! n; J2 i. e# T- N) P
6 m! a3 U% i0 o: k2 \ATOM ByVal variable As Integer 结果为Integer 类型的表达式
# y2 J1 {, b" L% k9 N9 o1 fBOOL ByVal variable As Boolean 结果为 Long 类型的表达式 1 y' J% M8 n4 b5 A5 O d( a) B
BYTE ByVal variable As Byte 结果为 Byte 类型的表达式
9 U% C0 ~4 n" M5 sCHAR ByVal variable As Byte 结果为 Byte 类型的表达式 $ C' J. Z ]( p1 Z
COLORREF ByVal variable As Long 结果为 Long 类型的表达式
9 F: K5 @1 p& P4 Q1 ODWORD ByVal variable As Long 结果为 Long 类型的表达式 9 I& J2 A! l2 W
HWND, HDC, HMENU ByVal variable As Long 结果为 Long 类型的表达式等Windows 句柄 . a9 I1 j+ `+ u* w2 q0 u6 J# b
INT, UINT ByVal variable As Long 结果为 Long 类型的表达式 & t, \ O: I+ |7 _) j& }
LONG ByVal variable As Long 结果为 Long 类型的表达式 + g7 }' z5 h5 e! V9 E
LPARAM ByVal variable As Long 结果为 Long 类型的表达式
1 }2 ]7 ]1 w, J# OLPDWORD variable As Long 结果为 Long 类型的表达式
! t$ v. B( T/ F! t; X2 NLPINT, LPUINT variable As Long 结果为 Long 类型的表达式
1 r5 f+ I6 O; c" R; r& C/ K2 JLPRECT variable As type 自定义类型的任意变量 2 n% Z5 u9 A) w1 q7 T3 T0 {
LPSTR, LPCSTR ByVal variable As String 结果为 String 类型的表达式
9 `4 y! ]0 h4 uLPVOID variable As Any 任何变量(在传递字符串的时候使用ByVal)
6 k3 L E0 N; H b3 E- sLPWORD variable As Integer 结果为Integer 类型的表达式
( X8 U% I& C' M% }LRESULT ByVal variable As Long 结果为 Long 类型的表达式 8 k( L0 ?+ u4 \4 f3 z) B
NULL As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer 结果为Integer 类型的表达式
4 x/ c' Q$ @% C( r8 qVOID Sub procedure 不可用
" z) h, P% s& C, @9 T) aWORD ByVal variable As Integer 结果为Integer 类型的表达式
& y7 ~9 e1 U% A1 H& V* D, \WPARAM ByVal variable As Long& A4 U: T2 |' _$ ?' Q
: e& e- J1 H |& w/ h3 s |
|