|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑 9 b+ J" d; e" H# f0 K
7 p" P& i5 _" W# E# E+ x' Z, o; l; k9 Y/ ~/ R4 a3 P) I
以下内容转载来的 部分亲测 部分未测试! h% d3 ?7 F8 ^& Z
( z9 J) }- S! x! j0 N3 r# S' R# U* h$ ~
9 J0 C! q6 W0 _) B& K
VB调用C DLL时的参数传递
5 x; h. r7 [. X9 N* q1 a. u1 `% `6 U! J0 L4 {/ D( T
函数在C中的原型,参数类型和传递方式 对应关系
2 B7 P' p! A8 K' @+ t7 L% ]5 h
8 H* f! u2 ?8 I+ M6 _
3 d9 A2 L+ ` E0 y6 C% V( c; n8 Y8 V* E; A
C DLL 原型 VB声明 VB调用
: w( _& C. n5 b+ ?
1 r# q4 p: M! \. H& KUSHORT a ByVal a as long Call func(…,a,…)
( u: j7 l1 y5 D( H" a0 O* [9 W$ z' Q1 P% m
int a ByVal a as long Call func(…,a,…)
6 I C8 f( z: s/ p3 J4 g3 ^3 M/ _2 C
2 }* F7 I) ^4 {& z Q! ]) Jlong a ByRef a as long Call func(…,byval a,…)
* H- y+ F- Y1 @. O. Y6 }& x: u6 D4 s* S" v, T/ N5 W F. P
int *pa ByRef pa as long Call func(…,pa,…)# M2 R ?3 V; r" f2 m
6 ^8 ?. J" X" E7 j) f
long *pa ByVal pa as long Call func(…,varptr(pa),…) <---------(1)$ l- Q5 _4 x/ Q8 j) E- O, F' V
& M2 W. Q9 c7 B) I1 c
LPSTR lpStr ByVal lpStr as string Call func(…,lpStr,…)
* `* `: P( F/ s# d: w# v7 F
+ b1 B) |# Y7 T, lchar *pstr ByVal pstr as string Call func(…,pstr,…) <---------(2)
( S# I/ Q$ I& A9 h" o
" q! z8 v- D* ]- jwchar *pstr ByRef pstr as string Call func(…,byval pstr,…)
( _* D- b! I. u! U4 N" ` D/ y( g2 f. y
struct tagX *p ByRef p as tagX Call func(…,ptag,…) <---------(3)
3 J2 t4 y0 c0 k4 U* @7 X& a h8 t- b$ }9 s* r
HANDLE h ByVal h as long Call func(…,h,…) <---------(4)
9 H0 T2 ^. m) Y$ W% ?7 ^6 I
+ h3 s2 q% _5 w备注 ( h4 Z" @( u: T y+ \ d
% s/ H' `+ [( G" e4 @8 ?0 q, q1)不推荐使用此方式
, y; J3 _/ c$ L8 s, p7 H2 d
/ w6 _$ H& Q8 B! r) x5 o. ^2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50
3 M5 L0 ]: p: i* {# n$ E
6 y1 K: e5 G3 z3)用户定义子类型必须用ByRef方式传递,
8 X# j* k9 n0 @- ?3 Y6 d; D! B
y1 ^, T' d0 E$ Z4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。
$ A& w+ C8 w A8 Y" E" N. T% x
' N% k/ _# L3 }3 p) p
* I. d/ O4 q" N! N' p2 s' I& T* F" Q6 u: s
, `3 S% }: Z, W6 D% l
6 j" A% C3 I, |* q% H0 A0 {9 e
6 @1 z& N, j% e$ \4 m4 W4 J: `
+ b8 v1 j9 h& K+ s! N* [# c4 k! r数组传递
* ?1 c0 V# U" q2 g1 W h8 L' `1 K" w: j
数组传递值用ByRef9 L/ I! Y+ o. L5 g
0 A2 y2 i5 I& H, W" @
VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。4 m* _, I* P; \
: G1 {' b% u; X+ G2 N( K: m, F. s# c, F% d6 S0 o P5 O
. R% w& `) d: B" P/ B9 H VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
# I7 d3 K* G+ Y+ O' K& u6 e/ b) M/ A! ?7 w& o4 b8 K& i* p3 e! t
6 G# |" a# V( }/ L! I
; C2 n$ b2 v& X
9 p/ K, e3 l+ R c
2 F, s6 z" X d- V9 N1 adll函数直接返回字符串% v* T+ q# e$ \% ]- D/ F( ?9 J
4 h8 Q/ H1 p2 B) v1 p% j& y. _
* v1 |& e; H+ }* c& I& f1 x) e
" h$ w' h; n* F0 S( o2 b1 I) J% D+ q: X VB下的字符串格式和VC中的char有些不同的# P6 I5 i& I+ W! }' U" P/ P- ~
9 R( ?$ Q' }# P7 \
直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子: 4 N5 i; b, ?; K0 N) l5 o4 I# h
( y/ w2 ]3 S3 e3 S) G4 j# w9 h' m) P( Q
# G( A0 S. C6 C6 X EXTERN_C BSTR WINAPI RetStr() j9 h" H, i5 U Q7 b* o; I/ S: Y& c
+ O+ y$ Z% q S) d% S4 v$ [* k {
. a. T3 m% H; I. `* L3 `
) {+ a. Q5 a. \ char *str = "1234567890"; : j# I9 f) l7 r. K; t# u3 {
3 f0 b. z; t6 w
return SysAllocString((BSTR)str);- C# T; j, Y( `0 }2 M, ^6 u
E& T8 y# X# j6 M$ U/ @. d }
/ V' U9 b# H$ p1 ~9 r# _- H1 g
或者参考一下VB下调用GeTComputerName的方法.7 P. [0 D: T: b- m+ x4 i% Q
6 }# o$ B* h( ^; L7 P. M S: K. E% J. X( ~8 X
% Q; T# c: A& Z/ h% Y( ?0 l8 }" x0 s2 Q# z
8 l5 H; X- j+ D j5 f VC++与VB数据类型对应关系/ y6 h8 C6 [, {* w; t
/ e* c" p8 \( x8 v* S6 O
VC++ VB& d. ` _; W" o
short Integer' z! W0 Z+ K+ s" W- C: j' L% J4 ~
int Long: H+ O, Q8 k$ `) A( R
long Long) ]- i$ |9 c" d0 F% \/ O
UNIT Long% v& M# N' _( O. \
ULONG Long* @! _: D4 ^3 q# |1 F
WORD DWORDLong r6 E3 ?: N2 _8 d
WPARAM LPARAMLong
* E& h9 c% |8 ]- ? LWMSG UMSGLong
+ N8 G* b3 j4 UHRESULT Long r# n- q' z0 C
BOOL Boolean
. ]% I% Z8 X5 j6 {; s$ ^COLORREF Long1 o( I2 M) s9 q( i2 Q
HWND,HDC,HBRUSH,HKEY,等等 Long
- c, R; d0 x( m' p2 ILPSTR LPCSTRString
3 o9 M9 G" n% H2 T1 \LPWSTR,OLECHARBSTR String
; ?; B$ I( @% i+ Q! W4 O0 V8 rLPTSTR String4 i. m- H& [ \3 W" Y. O) V
VARIANT_BOOL Boolean5 i5 H! V; g, U) x
unsignedchar Byte/ ?( v' e* M8 y
BYTE Byte$ `9 @! ~4 d. [8 ?* O
VARIANTVariant
: w9 L. k( q# `(任何以*或**结尾的数据类型) Long3 |; G+ R0 g! z( b4 ^: ~
/ m3 g! L. @8 S' v
; j( v$ ?3 { C7 K3 yc中的数据类型 VB中的声明 结果
! z# {( |2 w( q- Q0 ? t8 c0 F . d8 g! F7 Z2 O! N
ATOM ByVal variable As Integer 结果为Integer 类型的表达式
* n% z' R, w9 QBOOL ByVal variable As Boolean 结果为 Long 类型的表达式 : J- l) T# N6 K
BYTE ByVal variable As Byte 结果为 Byte 类型的表达式 . N) |' j' u+ d, o
CHAR ByVal variable As Byte 结果为 Byte 类型的表达式 9 c5 ~0 g5 F- ^% T# ~/ a. e
COLORREF ByVal variable As Long 结果为 Long 类型的表达式 % i9 Q0 ]/ d% m( \+ ]( [
DWORD ByVal variable As Long 结果为 Long 类型的表达式 * d! m! s w+ N- C0 w
HWND, HDC, HMENU ByVal variable As Long 结果为 Long 类型的表达式等Windows 句柄
, P# R0 j4 v6 I% V2 }6 mINT, UINT ByVal variable As Long 结果为 Long 类型的表达式 ) z$ W$ Z: }0 j$ ?
LONG ByVal variable As Long 结果为 Long 类型的表达式
; ?; S) I. C0 o4 e$ U4 {& n6 @8 [0 NLPARAM ByVal variable As Long 结果为 Long 类型的表达式
; t% T' I4 z$ a* _LPDWORD variable As Long 结果为 Long 类型的表达式 0 n! R. a/ n! f9 o
LPINT, LPUINT variable As Long 结果为 Long 类型的表达式 # L2 D% K0 C+ p: P1 M7 J7 G
LPRECT variable As type 自定义类型的任意变量
$ n" S4 ~/ K& U# N5 u) iLPSTR, LPCSTR ByVal variable As String 结果为 String 类型的表达式 # D: s: h9 \! s
LPVOID variable As Any 任何变量(在传递字符串的时候使用ByVal)
7 F3 D- ]% {: F2 b$ DLPWORD variable As Integer 结果为Integer 类型的表达式 9 a3 B7 f! m% M/ u5 y/ C K
LRESULT ByVal variable As Long 结果为 Long 类型的表达式
. \2 c3 f4 o# |3 v! i% _NULL As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer 结果为Integer 类型的表达式 % b' l. f0 Z3 Z3 z' c9 k h
VOID Sub procedure 不可用
+ y7 `& [) h9 u. S2 h+ `WORD ByVal variable As Integer 结果为Integer 类型的表达式 7 t/ `$ O8 B1 e+ G" ^0 a6 e
WPARAM ByVal variable As Long
. v& ?1 B/ S: i+ l& a& C- p1 ]6 p {0 W4 p- X
|
|