|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑 & V- J' G% m4 q, l4 p/ D
( P8 t/ }* D& [6 G5 o" x& x$ |
% G# I, ]6 n2 z" A& W! Z0 V5 A, r* k以下内容转载来的 部分亲测 部分未测试% b3 d7 z: L4 G# D6 x
8 L) g* [& ~! ~5 n
: ^6 [( B% n- w3 `% t; [: U1 E' ~4 W$ R- o y) w7 k
VB调用C DLL时的参数传递! e; t, ^9 D! w: B" B Z: w
! J; c& S0 \) K4 C7 Y! I0 S
函数在C中的原型,参数类型和传递方式 对应关系
4 B+ Y4 y/ u% v" E7 R
9 }9 \1 m! h) n1 Z& L. V' m/ m- @1 a1 m
3 z! J% f: k" Z4 s9 F- rC DLL 原型 VB声明 VB调用! a6 U; l, G3 d' F; t5 D
: }0 ^! `) n3 Z- @7 T+ s2 xUSHORT a ByVal a as long Call func(…,a,…), O3 |4 I- k% E8 |# O. X9 }4 x
4 u, R) P* Y7 ~6 v: S- J7 _7 y6 A5 s
int a ByVal a as long Call func(…,a,…)
_3 C3 `: Z4 g3 ~2 `/ R/ p* z
# I6 Y0 K8 h8 J' Z0 Along a ByRef a as long Call func(…,byval a,…)% |+ m/ u% Z5 x
$ T% }9 J# l3 j/ w# pint *pa ByRef pa as long Call func(…,pa,…)
3 S! ?4 B% I+ V! |$ Y/ Q
& O, G" u. |6 B3 flong *pa ByVal pa as long Call func(…,varptr(pa),…) <---------(1)
- P0 W; Q, i7 p, p: C% q. W! ]
, ` T2 g! a% Q1 lLPSTR lpStr ByVal lpStr as string Call func(…,lpStr,…)
* w7 H+ V7 F& q3 v& _, t: L# A% m1 t4 M' {1 Y
char *pstr ByVal pstr as string Call func(…,pstr,…) <---------(2)
" r' `. i8 I( X$ b9 y' G
( _" J2 m% Q( p' |8 _3 swchar *pstr ByRef pstr as string Call func(…,byval pstr,…)
k& w: \5 T: ?1 N3 C3 f1 J' @, x. l4 m$ A6 @3 L1 c
struct tagX *p ByRef p as tagX Call func(…,ptag,…) <---------(3)
# X* V( x/ j' k0 W" w2 u4 F) j. z% h$ e# g/ B. D! i
HANDLE h ByVal h as long Call func(…,h,…) <---------(4) + G! n1 X' ]7 _+ |' g+ G' [
1 M% Y8 r i, k! L" x
备注
- N: t; \6 j" o/ Y* i! g# ]' H( P: S: E. G, h
1)不推荐使用此方式
9 i5 d& F/ m8 a
4 F* @5 U0 S0 v) i5 Z0 ?0 @' }4 J2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50. f V# R7 a/ Q
! r" U; ^) d) g
3)用户定义子类型必须用ByRef方式传递, " C; N. U4 k" v9 t! P
3 E: I: M4 I+ a9 o2 s4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。
: d$ g$ q+ D$ [, x7 U/ \: X3 m! l8 ?+ W, P s7 A
2 Y# K1 H+ s8 A- N( v
$ ]* d( d+ w$ X3 u2 t) |9 v/ q) _
+ A2 f) g: X' e4 z9 O4 [/ p& O3 c3 f* @, X, F& Q: `- y2 A
8 H# }% i' a9 x$ x) {
( r8 P4 O! L) ^: M数组传递 1 t& `* D( p- Y* `6 n, ^
! G3 j, o( g+ m1 V 数组传递值用ByRef- {+ O; k q0 q+ `- r# l/ X0 u
9 v4 W! i7 ~- O% b2 C# C8 r VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。$ d; S7 Y' ]8 K6 V; c2 B, V
3 _* Y; ^& R K% @6 J6 m. j5 y; }2 O2 w3 k! m- e( c
2 f% a( ]0 S' a$ r5 a
VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
* X; M5 H z+ A# N- Z# w. Y" W3 z% v+ N
]4 u/ o+ z4 F& f0 G1 i& [8 _( I. M) z) f
% S2 {+ D/ @& z8 i- h/ x# v5 o" g
4 j3 }& h* g. `, a P5 D6 a
dll函数直接返回字符串) {- E# d- Q7 a8 ]8 O! s8 @8 e# C
* K; @0 w; F. k0 D; i2 S
, L; m# y- m# @7 n# u m* g- S
1 s8 _* c7 |- U VB下的字符串格式和VC中的char有些不同的' ~; D- t# V" Z
8 D2 N- u" B* @8 v% _1 ^4 j 直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子: r1 F" n# Z4 s, z
- d' `+ l2 o. [. Q+ y
5 q6 ]! l- }2 s9 i
9 X- X7 a1 f+ K' {
EXTERN_C BSTR WINAPI RetStr()
4 K+ k7 q; I: }* l O7 y7 ?# g% m8 g2 y' ^
{
2 r$ D, x+ a! ~0 Q7 [! _: T6 F. ~* r
, E' O$ }# h1 w char *str = "1234567890";
5 E4 B U- ~4 e: o4 J p7 {/ T1 \, A9 e W
return SysAllocString((BSTR)str);
. b1 u3 r3 k/ a9 I) Y2 T
- @2 d' F3 E0 L- f g, l+ e% d1 q }
1 Y m9 D: a- ]' e0 u# L; V) L% ^; i; W# F+ V1 @8 d/ K
或者参考一下VB下调用GeTComputerName的方法.4 _9 z: \% e' R% u4 ?* B2 _
- y/ ^' o5 T9 ^3 \" H5 V
% m4 b% H3 S; g' _* B' A8 e+ P5 n, s7 \: m
4 l' n, C3 z/ J* w7 I. Y( P4 `: G3 O2 ?( E- [' A6 j
VC++与VB数据类型对应关系
4 L/ M$ A# y: {. B
' [ x) D8 M0 I3 n9 F2 @! _8 AVC++ VB
5 i; C. y+ a; |$ `( Cshort Integer+ V' L! h4 n& G* t
int Long
5 X4 y4 R8 O/ L* s4 i, Ylong Long) b0 _, o; V2 c/ r+ ]' k3 i7 e- G
UNIT Long1 ?: ^# U/ ~ F; h# V' ?
ULONG Long6 C7 B) w: }8 T F5 I( p+ s
WORD DWORDLong
: C; f$ a9 f9 c4 l z3 l7 ?, F$ EWPARAM LPARAMLong3 ~8 Z- q( e. t- j+ G* v
WMSG UMSGLong
" N& i/ ~" ^& \! o5 D' _% C3 G8 jHRESULT Long
e& p: a6 }2 h; y- I+ E, _BOOL Boolean
- p6 [1 d6 }6 l) E, ZCOLORREF Long: t" ^3 C k* b5 n
HWND,HDC,HBRUSH,HKEY,等等 Long6 Z" G6 `- V1 }0 o) d, c
LPSTR LPCSTRString
5 w/ g% k* N1 _9 q& \LPWSTR,OLECHARBSTR String
& s3 x4 V; m( n3 N1 N' \LPTSTR String' z/ V/ S+ b( m+ x! b1 u& b
VARIANT_BOOL Boolean: g8 E! M) F7 L, E/ _ y/ ~, F" z
unsignedchar Byte9 v7 ~) S" \: z
BYTE Byte; S- \* r! x' t
VARIANTVariant
7 T7 i$ v5 L: z6 u' x" }1 O/ P0 F(任何以*或**结尾的数据类型) Long f# h9 R" d9 L* t
. C K2 J, L9 p6 R: G. L: ]& ^0 q! ]9 k, m3 S- z0 n* s7 ?
c中的数据类型 VB中的声明 结果
. X" ]" m! j* r5 `* x
) y, l) O8 V1 N+ L( T$ CATOM ByVal variable As Integer 结果为Integer 类型的表达式 & h( K2 ~% i" {* n0 D+ r
BOOL ByVal variable As Boolean 结果为 Long 类型的表达式 * K: V, f o( X d* r; q5 Z
BYTE ByVal variable As Byte 结果为 Byte 类型的表达式
) w, R5 W& @) M$ \. v, w; CCHAR ByVal variable As Byte 结果为 Byte 类型的表达式
' v L K8 p# xCOLORREF ByVal variable As Long 结果为 Long 类型的表达式
. }2 B5 \% x% L! rDWORD ByVal variable As Long 结果为 Long 类型的表达式 2 ^! I0 t" p/ d9 x
HWND, HDC, HMENU ByVal variable As Long 结果为 Long 类型的表达式等Windows 句柄 5 L6 V3 o4 ^7 L' d! A9 R& z' s
INT, UINT ByVal variable As Long 结果为 Long 类型的表达式
8 u5 b) q4 f3 Q! f# X9 OLONG ByVal variable As Long 结果为 Long 类型的表达式 ) P$ o1 N% c. r: G# |* m1 _! A
LPARAM ByVal variable As Long 结果为 Long 类型的表达式
5 D7 g" N% s' C9 F. `+ y1 zLPDWORD variable As Long 结果为 Long 类型的表达式
0 j& s- q( [9 u' O! z! U4 M% Y) MLPINT, LPUINT variable As Long 结果为 Long 类型的表达式 + l C8 x& B# J$ T4 g
LPRECT variable As type 自定义类型的任意变量
6 }6 e2 f% J# g3 o4 _! X) k: N+ nLPSTR, LPCSTR ByVal variable As String 结果为 String 类型的表达式
- i3 A4 @3 P( j4 E( ^LPVOID variable As Any 任何变量(在传递字符串的时候使用ByVal)
) i3 e0 u7 c$ sLPWORD variable As Integer 结果为Integer 类型的表达式 * t' {/ y* X2 c' V0 j
LRESULT ByVal variable As Long 结果为 Long 类型的表达式 3 e! p3 Y$ G- m) S; Y7 o
NULL As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer 结果为Integer 类型的表达式 , P6 w( c6 |2 R% J; [0 `
VOID Sub procedure 不可用 1 P" ]" r) H$ g. ~
WORD ByVal variable As Integer 结果为Integer 类型的表达式 6 a# \) M: }4 `- C. v8 Z: F) `1 c
WPARAM ByVal variable As Long1 G( W) x ^- c9 ~7 a
; ^2 ?* b3 k5 ?# F
|
|