|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑 , U3 S) M; g- V/ s. P
; O, P% W6 T/ K7 Z9 T2 w+ y+ Q6 t( F1 M0 e+ V9 b
以下内容转载来的 部分亲测 部分未测试
0 y) Q4 t' C9 ~8 f0 H. m$ o9 }& H- s
) y5 d5 e5 V% P2 N5 f
' b1 p" T% n% k0 t k7 H
VB调用C DLL时的参数传递+ J; N9 h3 c6 S7 B: w9 I
) C: v$ q6 s" G* A3 u
函数在C中的原型,参数类型和传递方式 对应关系
) X. ]1 `4 \) @! k
% N K# ?6 }! t2 S' S& O2 ]
. e* x- W; F3 t) Y( g7 m. s9 \
]- W3 V6 F3 [) l, l* N4 V7 aC DLL 原型 VB声明 VB调用1 O m2 h; j; O+ [/ B9 ^
T* P) u+ t) i# s3 sUSHORT a ByVal a as long Call func(…,a,…)6 u: u! D( v' w1 K7 n3 G
' ~7 ^' W1 v. `4 m+ T& K: m
int a ByVal a as long Call func(…,a,…)
6 c% w6 U& m' m
1 U# K! j; x* ~4 z( A1 B3 Glong a ByRef a as long Call func(…,byval a,…)4 |7 q+ E1 L' O
. p5 P# ~/ S5 L* H% jint *pa ByRef pa as long Call func(…,pa,…)0 T' S" Q$ ^, y! y1 e) ~
3 H2 f/ {/ F( Nlong *pa ByVal pa as long Call func(…,varptr(pa),…) <---------(1)
' Q2 X) R7 M8 O) X/ _# l1 F$ x6 v! t& F
LPSTR lpStr ByVal lpStr as string Call func(…,lpStr,…)
) w, m4 F: r& P& S
" w0 h4 q% H) u; E) L D0 o% B4 \char *pstr ByVal pstr as string Call func(…,pstr,…) <---------(2)3 e& Z/ I9 ]' m% V0 a5 `
% U$ W& E9 o! p- E1 o/ Uwchar *pstr ByRef pstr as string Call func(…,byval pstr,…)
9 @' @& G+ m! Y" k% m6 J; \" O# r
) U. F4 Q9 \- ]$ G* O" tstruct tagX *p ByRef p as tagX Call func(…,ptag,…) <---------(3)
% p9 y- X% c8 u8 H n q
! s, F# h$ H4 J" u. t. [HANDLE h ByVal h as long Call func(…,h,…) <---------(4) % l+ q3 p# \, V9 b$ m
/ l7 J1 F5 e$ K4 x: E3 n& _备注
/ J% U' Z. Z1 Z3 M
8 |/ W* Q5 c" w1)不推荐使用此方式
* \% o$ e" Q7 u1 b
4 d A* Y0 [3 n$ J3 y/ o3 C2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50
2 @4 l+ A7 L7 V6 C3 M8 @8 K, l, f7 _8 Z# D j3 @8 X
3)用户定义子类型必须用ByRef方式传递, ' o4 I2 _5 A7 U9 Q) g
+ @2 F: ]6 U/ ~% s
4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。 * N3 @0 G6 D2 A7 I# O5 X- Z/ F
3 n; Q E+ X( V/ G
. m6 w* T. { }1 `5 C) N) O' }
a3 M7 H1 N+ w9 P# J/ ^ O: p! ]5 e, |
3 _* n5 K [- L( R/ L
% M! _5 N/ F3 [& y6 t" k& V3 x! h: O, n+ K3 H# V# K- |, K6 V
数组传递
. s7 |* m6 _: `$ S* k( N! g
) ~1 H+ c5 y% J% X) }1 D' E+ H+ q- Z 数组传递值用ByRef) S+ R% d) k: o1 s( l
, g* ?# k. q, w4 M9 o0 @ VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。
) @& f# L+ h* {/ i) o: _- L% w) R( k5 p: t" {. W) c
+ i6 x6 T& K2 A: [
+ |: K2 ?. B2 U
VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
$ g7 m6 G) ~7 \8 Z/ N$ _* o
) N v/ x5 D# H; I% W9 I
, p8 t7 r/ F- ?3 | H' [+ U; V
- V) ?4 r% u! G; @& b( O) |; v) r- s
dll函数直接返回字符串
. R! s' M' y7 w7 t3 a
# x) F K6 T9 O% f/ t' V! @) v
* n# F3 S3 K' W- U" i8 M) H% e ]6 m# W# c. h1 Y- W
VB下的字符串格式和VC中的char有些不同的, V3 \9 g, h2 l4 V
. r7 G& m6 n% S
直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子:
, c0 V8 g0 l- C& n1 g* z
9 Y B1 T1 q5 o; [3 h' d5 Z9 G2 ?; d, m: `
% X0 W) J' ?4 b8 O
EXTERN_C BSTR WINAPI RetStr() ' v* R0 d! f4 X) S' J
3 |/ p# O/ Z8 _7 R
{
' l; R4 F o5 X: y; l- s# h* q% O9 r
char *str = "1234567890"; : Q: N& ~, B d
& w* `" s; |: N. m
return SysAllocString((BSTR)str);& F( E2 L7 ] i( O
& _8 }0 G2 E' \' {5 n
}
' b% e1 K2 Q" ~2 T& W q; V4 _! ?; |: |% t o
或者参考一下VB下调用GeTComputerName的方法.
+ J* c3 a. x% e. `7 M% ^7 y8 [) e
2 [5 O3 E; n! a) k/ S" t7 Q* r2 ~7 T- }8 |# l( \( J' R4 Z$ }7 z
( e* c0 M1 d$ n7 L A, l3 H. I t. M, g, |7 ?) ]2 e
, z" e/ g8 t' V! J6 n3 {( b VC++与VB数据类型对应关系
5 M) `8 A* c( g2 R/ U' e% v+ n w* M1 u3 `; y
VC++ VB+ P* Y% t6 l# m
short Integer5 o# j+ r9 p0 o* C
int Long
& L+ k9 c. d2 glong Long
5 ~3 C3 w/ z7 ]. H o7 L5 \& pUNIT Long
+ E: A: b# a& Z: S/ QULONG Long. @3 N2 \; E9 s6 [2 @( \
WORD DWORDLong+ F' O" {3 G! X2 e2 {- N' d
WPARAM LPARAMLong
: P# `; ]6 z$ }( t# c) {WMSG UMSGLong
& F; y: t; K/ L7 bHRESULT Long* |8 ~- U, N' q
BOOL Boolean
! X$ K @. o1 q# Y/ d$ ]9 WCOLORREF Long
" [' K! x( T8 O8 sHWND,HDC,HBRUSH,HKEY,等等 Long- X9 b' X: C% K( B6 Z/ p
LPSTR LPCSTRString* ?* B: B t( ?$ {, Y3 ^
LPWSTR,OLECHARBSTR String
j, ?1 R2 ^8 t+ ILPTSTR String
`" w9 D1 v- b! O, {. |0 f/ nVARIANT_BOOL Boolean
: R! ?+ {1 W: P. l0 I. nunsignedchar Byte
4 Q0 B" e u$ C m0 QBYTE Byte
3 n8 @. y7 m1 b. a8 IVARIANTVariant$ b, h5 J6 Z9 I1 N4 |# e
(任何以*或**结尾的数据类型) Long# x9 ^2 c: B; ^# c! m& }8 ~+ A/ q
7 y. j4 e& T% s, @+ w* T2 h
: b) z9 z% S N& ^
c中的数据类型 VB中的声明 结果: i2 j' W/ e* A }( b
& h- ^* I- I# u R( V
ATOM ByVal variable As Integer 结果为Integer 类型的表达式
0 Q# ]! [2 H0 WBOOL ByVal variable As Boolean 结果为 Long 类型的表达式 + W5 s5 M6 K0 N r9 a5 d- Q5 X
BYTE ByVal variable As Byte 结果为 Byte 类型的表达式 4 b. k$ r5 m! X+ y$ L
CHAR ByVal variable As Byte 结果为 Byte 类型的表达式
: \0 X' r1 _6 C K* u; ^- rCOLORREF ByVal variable As Long 结果为 Long 类型的表达式 , Z8 A+ W; i" r$ f, h; |
DWORD ByVal variable As Long 结果为 Long 类型的表达式 9 P8 f, |4 Z |) b8 X5 A* m# C( a
HWND, HDC, HMENU ByVal variable As Long 结果为 Long 类型的表达式等Windows 句柄 0 e! p: `) e& v
INT, UINT ByVal variable As Long 结果为 Long 类型的表达式
4 x3 a6 A/ t9 P# q$ T a7 m% L/ ?8 RLONG ByVal variable As Long 结果为 Long 类型的表达式
! s# v1 { m- A$ ] R! VLPARAM ByVal variable As Long 结果为 Long 类型的表达式
; S3 s4 T) n) H, fLPDWORD variable As Long 结果为 Long 类型的表达式 . Q A+ @0 w$ O- }) y, @/ T
LPINT, LPUINT variable As Long 结果为 Long 类型的表达式
& ~0 F1 \+ C1 o3 E4 @$ h; aLPRECT variable As type 自定义类型的任意变量 # K# X Z# r+ t6 F+ `2 q8 j
LPSTR, LPCSTR ByVal variable As String 结果为 String 类型的表达式 9 Z9 A. M$ Q7 o3 G5 @% r" A9 T2 H
LPVOID variable As Any 任何变量(在传递字符串的时候使用ByVal) # }; [7 a; q6 ?% G, Z
LPWORD variable As Integer 结果为Integer 类型的表达式
' e; Z1 J! X9 ]0 j9 `& G! O- yLRESULT ByVal variable As Long 结果为 Long 类型的表达式
" T( k3 Y) M; C: H; L/ FNULL As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer 结果为Integer 类型的表达式 ; E1 u |* D4 s" s; v( ]; v( J3 C
VOID Sub procedure 不可用 , s- l; g: c: |3 O3 y5 g* }
WORD ByVal variable As Integer 结果为Integer 类型的表达式
( F1 n/ O0 {6 M$ H6 t, |WPARAM ByVal variable As Long
# o3 i$ H5 o# Z8 C3 g
/ ~8 h: Z, n; a; R |
|