|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑
: B3 H. l4 W! Y( j
) X u5 ~! I+ V" e5 p% T, S4 u/ w( u3 G6 [
以下内容转载来的 部分亲测 部分未测试, D3 a* I2 f0 ~- M
( u* J5 a/ F3 N1 ~$ i
0 x; e4 X- I1 p. i2 y
% F3 L' h" ?, k' AVB调用C DLL时的参数传递6 k7 u( |& S/ x, o8 Y' o: y
+ p$ l$ P4 f' D& `0 k; n函数在C中的原型,参数类型和传递方式 对应关系
- H! x8 Q9 ]7 \ @& T3 o9 w% F$ m' J8 P" o+ f- J8 q
; N: {+ S; D! T I" s! n" C- D# h: ?2 T$ C
C DLL 原型 VB声明 VB调用
3 V: {# U* J+ z$ q) {5 ?5 V( |- {+ {( ~5 z# g
USHORT a ByVal a as long Call func(…,a,…)$ y0 E. P' z9 t& o
. A# Y& r/ s V* B( o, `
int a ByVal a as long Call func(…,a,…)
/ `: C7 m: J/ ]1 H
$ r) r% `& d2 Q& S# c0 {long a ByRef a as long Call func(…,byval a,…)/ o) F4 |' X7 ]1 d$ `$ Y* @
4 b0 \* ` X+ S1 L$ v. F& q( W
int *pa ByRef pa as long Call func(…,pa,…)
) h: y* U1 p4 [/ _7 j0 y4 P( e, g0 h h; K
long *pa ByVal pa as long Call func(…,varptr(pa),…) <---------(1). e6 c5 w/ k- C8 p" Q
. X( A' I+ e6 m& H; m( o) m) W
LPSTR lpStr ByVal lpStr as string Call func(…,lpStr,…); _' H9 D: o. G; D/ E5 b' [
9 d) g! {. f& [ q/ ]. Wchar *pstr ByVal pstr as string Call func(…,pstr,…) <---------(2)
: s- L6 F; f6 K0 Y- O3 B
$ L5 c6 [) l) \& |wchar *pstr ByRef pstr as string Call func(…,byval pstr,…)+ @/ `) k5 u& e6 x5 X4 G
! z& u. K, X0 e/ E% ]
struct tagX *p ByRef p as tagX Call func(…,ptag,…) <---------(3)
; S/ N8 B! \0 X, u8 J- r8 y- C0 F- O, B3 M' v1 ^
HANDLE h ByVal h as long Call func(…,h,…) <---------(4)
: }% G2 h$ h9 N) L- Y- U/ i3 R0 r# _/ x% }( u/ S4 }1 m8 v
备注 E% N: F+ C* G: X' `
# j" j3 }# X$ x6 f
1)不推荐使用此方式0 a$ b) r) b/ n' }% n/ K* t; D3 t
0 ~6 e4 v: a' ~, b1 n2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 507 v7 N: F8 U5 W9 L# Y4 A s
2 [0 y6 Y7 y% @0 z3)用户定义子类型必须用ByRef方式传递,
- |# }; ^4 U5 Z) O; a7 _
' ~5 I' K+ |; @3 I% i! n- I) p; V) h4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。 1 B% k6 ]3 x( v! L% @) K
* M6 U' x$ I3 T, T- d0 D; n
3 ~$ {" F4 z5 C, \! @6 @/ s
4 v* z$ M3 \% M$ @+ F2 v8 o9 ^+ _* a0 K5 S
% l: R* v7 M% w# t' L# C0 {5 q$ w% k& ]( U% y r
: T; z) N, `1 E0 r) U3 N: k
数组传递 . n1 [5 ?9 V# ?0 x
6 Z( h4 R$ B o* T0 ~ 数组传递值用ByRef' k6 ?1 ^. V: W0 D) L
9 x' X1 O0 H: W' z$ L# \1 W: a
VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。
# J8 f2 G3 f* A! x- r% ~6 I! ^% x( R) p8 T3 d
; W; J0 }! Z9 [3 s: ?/ k9 m. F2 s
; ]9 I7 D, ~0 f4 t, j. P6 E VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
" `& k; [4 }) b3 p
5 [3 `* O6 P, w6 o3 N
7 Q) J k8 e$ R! |. p4 I7 `' F! _6 c0 ]7 a6 l0 N
0 B1 i/ k! y: {* E' v
, F( ? q5 ]' j, L, f$ e; Fdll函数直接返回字符串
/ Q# b5 H( L, A2 e/ s
7 ^9 {# \8 h, y) Z
5 ~# X" E; U, k- P+ M% l" J
; k, R# `" U0 ~8 ` d VB下的字符串格式和VC中的char有些不同的
* M7 B5 d* h" r% p+ F1 J! R( E5 r$ G, u+ G
直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子:
% O, o) \- K0 b% q% i- X% ~9 }
# p: P, W7 U. y4 |3 X- X& W" C$ n% h5 p9 a
5 D3 U( H5 \/ R" V( O9 h0 `; w EXTERN_C BSTR WINAPI RetStr() ! W# S' z8 |2 S8 G
; @' N) s$ M% j {
2 J' Z2 s5 q4 @9 G0 W: x0 K
6 G( Q( |3 h. T/ Q. p2 {+ c char *str = "1234567890"; . F. @0 ?5 x; [. @0 W
: m; B& f3 {) a! G. p0 R. [
return SysAllocString((BSTR)str);
- }$ M' H; I" W3 @, a J5 `
+ O& T+ K% p* E% \& y* F } ' @0 i4 T+ _: ^
# [) d) v) c# s* ?或者参考一下VB下调用GeTComputerName的方法.
: \2 C% U- m. t' [+ H3 P4 \6 j* i. n: b/ j. j6 w s0 u* ?( x
1 C9 B7 {- Q1 d/ m& y+ _! R( u2 a
+ s8 s' R/ S& a
2 u* k& s' q( `2 j0 v6 b0 R
7 f5 R- B2 [! F) t( M; e/ `! N VC++与VB数据类型对应关系6 K- Y: ^3 }9 t8 q2 j! x {
& i" j/ q- n B7 V F# W5 e, GVC++ VB
6 ?9 ]* M1 z+ j# k7 a7 S% Rshort Integer$ }, S' R: x% s+ r9 P
int Long- G" |0 g, m: |% u
long Long
n/ z/ p3 T# A$ n4 PUNIT Long" x6 d1 H) ?- x# }1 J
ULONG Long
2 Y4 k \/ S& H1 G; jWORD DWORDLong
9 o& | b7 X5 X4 g7 e( J8 }WPARAM LPARAMLong
5 ~+ X, x2 Q2 C. z; v8 }: o5 |WMSG UMSGLong
& Y6 Y1 w5 h4 m) EHRESULT Long) b' u2 J ~; V* a
BOOL Boolean2 y& m9 f+ u) @0 R- F& k& U
COLORREF Long
9 z1 `0 S e7 ?$ g7 K& vHWND,HDC,HBRUSH,HKEY,等等 Long
" Q( l, J, G) B' t- ]: {LPSTR LPCSTRString4 L1 w! F0 t3 z
LPWSTR,OLECHARBSTR String) f% b9 K( H! d; Z) u( k7 h- @. \
LPTSTR String
6 q3 t% N' ~) \& A1 @7 qVARIANT_BOOL Boolean% l9 L; @) c K W' }
unsignedchar Byte& d$ { K9 I" O& Q* ~
BYTE Byte1 q, Q0 G6 ]5 Q( \9 d8 G
VARIANTVariant
0 @. c) I% Y" F) P6 f6 B; z, g& i5 j(任何以*或**结尾的数据类型) Long
: U: d1 J7 c$ d$ d8 y3 L f; H1 B8 j' c/ \# B
) R/ m3 H: W6 `" U; N! @" J% m- O o
c中的数据类型 VB中的声明 结果
& w s2 z" u. `+ }6 o
8 ?+ K& d5 a! O, m( U/ ?! h8 WATOM ByVal variable As Integer 结果为Integer 类型的表达式
2 d j! H4 ^/ k6 d) R0 [. T+ ^; WBOOL ByVal variable As Boolean 结果为 Long 类型的表达式
- y$ h: F/ I3 vBYTE ByVal variable As Byte 结果为 Byte 类型的表达式 0 P( ]. `3 B1 d/ x5 I G
CHAR ByVal variable As Byte 结果为 Byte 类型的表达式
( F; N7 z) Y% U* H4 ZCOLORREF ByVal variable As Long 结果为 Long 类型的表达式 A2 v( a, X: l1 u8 a8 W: H. \1 K
DWORD ByVal variable As Long 结果为 Long 类型的表达式
2 }, u- t6 M/ i8 u. V) Z2 vHWND, HDC, HMENU ByVal variable As Long 结果为 Long 类型的表达式等Windows 句柄
. R% \2 R7 K9 r9 i& L5 j4 ]INT, UINT ByVal variable As Long 结果为 Long 类型的表达式
. E1 p# o m ?5 B1 r9 N VLONG ByVal variable As Long 结果为 Long 类型的表达式
% C0 R( [7 U/ Q( q2 MLPARAM ByVal variable As Long 结果为 Long 类型的表达式
: a* ~8 C6 F( A0 GLPDWORD variable As Long 结果为 Long 类型的表达式 ) A+ g1 g4 I9 x) e6 s2 v
LPINT, LPUINT variable As Long 结果为 Long 类型的表达式
8 H3 [( x, c8 r/ qLPRECT variable As type 自定义类型的任意变量
O) R. c) T" y8 CLPSTR, LPCSTR ByVal variable As String 结果为 String 类型的表达式
0 E. O# h$ M! VLPVOID variable As Any 任何变量(在传递字符串的时候使用ByVal)
- @4 [ y1 n) f" X& o7 i+ |LPWORD variable As Integer 结果为Integer 类型的表达式 5 Z) y8 C8 b5 g) X$ M/ {
LRESULT ByVal variable As Long 结果为 Long 类型的表达式 ; R: h- i5 t4 r" x# V
NULL As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer 结果为Integer 类型的表达式
+ V8 B, U3 H: z% EVOID Sub procedure 不可用
: X2 h3 P9 }: yWORD ByVal variable As Integer 结果为Integer 类型的表达式 * U, q& T/ m! n) c
WPARAM ByVal variable As Long$ A; K& B, O# ?: |4 g ^5 U
j8 m" `9 q/ b5 I |
|