|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑 5 o' W$ v1 t$ ?
" Y+ i% q+ V0 I0 Z% }4 ^9 ]
% K0 r8 f6 u9 w# q i6 ]
以下内容转载来的 部分亲测 部分未测试. _# }* L& o+ p8 q* H4 G
( x1 E/ Y0 [4 o1 m7 g: w1 H8 L3 s+ ~6 \9 |7 d# o
; r7 J5 s8 M& M/ L5 E5 C
VB调用C DLL时的参数传递
7 I! r% F" F) {7 w# C' f0 k3 B5 s: _1 J2 }
函数在C中的原型,参数类型和传递方式 对应关系 . v. U" g5 J r. e, N
6 P; A, f1 b- e0 m# q, S/ o( U
0 B" M/ @. F/ _/ V, s8 k/ I1 D% G3 n Z5 U3 O: P+ ]5 S
C DLL 原型 VB声明 VB调用
1 L c$ c6 e1 U- m# P; @; A9 S+ i( u5 k" a' D9 P' \
USHORT a ByVal a as long Call func(…,a,…)5 L7 K3 D, k. `# {# A& q% d+ n3 s
5 s, y7 v; X/ K- |7 `- k! Tint a ByVal a as long Call func(…,a,…)
2 K6 E8 ~% j# I% m* e* Z0 c9 j) j+ R* z
long a ByRef a as long Call func(…,byval a,…)5 V9 r' \* h' k @" e+ |) d3 V
8 u J- E! E' f1 Q
int *pa ByRef pa as long Call func(…,pa,…)3 }1 n# [ i! o
# v. } D) M& t4 E8 z
long *pa ByVal pa as long Call func(…,varptr(pa),…) <---------(1), u1 U ? C& B" n5 O
4 s3 D L" F: a
LPSTR lpStr ByVal lpStr as string Call func(…,lpStr,…)* \" C/ X6 I3 G) A5 E
/ M0 Z. J9 T: ?
char *pstr ByVal pstr as string Call func(…,pstr,…) <---------(2)
7 L/ F4 `8 T) o* h& _% P d
O4 a8 A$ e E5 ?: lwchar *pstr ByRef pstr as string Call func(…,byval pstr,…)
8 W+ B( @! q' r& w1 \
9 ]7 V8 S; N( a2 G0 t# G0 T6 Ostruct tagX *p ByRef p as tagX Call func(…,ptag,…) <---------(3) : s& r( h6 z; t5 e. R9 Y
; V( T E6 V# ?( d6 K" f8 e8 \HANDLE h ByVal h as long Call func(…,h,…) <---------(4)
, ~ E# Y3 J: f& s4 U) i; |$ ?) r0 J
. C% C3 r, w+ \. Y3 @. v备注
7 c1 D0 Q8 A. Q' v' b0 N, F1 f
0 o9 N1 \; h) M" W- z7 t. t) s1)不推荐使用此方式 {) d# ]! x( n1 |# _; H' L, i
8 C% I+ i1 n$ }- R+ d2 s7 o" D$ Q
2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50; D# p) V* \% p0 X
& R: a, u: ]* U$ S! h3)用户定义子类型必须用ByRef方式传递,
' s/ s2 F e8 e# P& `$ o/ B) r( F6 A: b
4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。
% L6 X8 S( f2 A+ \& `
2 q! P! E" o3 n. [2 f. N
5 [7 B1 F% ~2 G$ T2 r4 W1 m) z l
' f. `8 s+ c9 A& z0 x3 G- E" O5 m, `- `5 e1 F( L2 _
2 D% m7 J4 j) c, H
+ y# w- Z. I2 |
6 u2 s3 n) @* f& F( H/ @3 t数组传递 ( Q! T. ~% P2 {* K* B
, U2 Q! J' O1 f8 k 数组传递值用ByRef+ \8 L7 x) d( R. k2 G+ y) @: w
+ G- g! f' o. {( p" r1 m VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。
9 h6 Z' S# S; J. G* P1 A$ b: _- Y+ {7 C$ T1 F& f
' p @9 K2 @- f+ g; L* e2 H* b
: I! ?2 z8 `! e. {, w VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
* v9 w, E+ i0 ~6 i" D. a. Y: v$ Z: b* o+ \9 F$ i. m
' V+ _1 u; j. v! `
2 R& V$ e, w, M, B$ ?
7 w% p# p/ b5 w4 J( C: Z1 L' C) P! y# ^- B* ~
dll函数直接返回字符串
+ q- d1 g4 O% L9 C' @, b8 E; y0 E
0 H" g, d1 x7 Q" r( b( |- x3 q$ q: C& I) b* j
k( |$ o8 q. A& ]* Q VB下的字符串格式和VC中的char有些不同的1 [) w3 E2 C( a" E4 w; |
+ K# L. [9 G) u9 J8 p6 b- y
直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子: 2 p$ k! Y" S3 x3 o ~
; s7 a% a/ e1 v3 h3 t- _
' U, ^ j$ A4 a# v7 o+ y w; h; @5 ]& o* ?
EXTERN_C BSTR WINAPI RetStr()
% t( r# Q1 x( Z0 j: w0 c. w
3 \( i. u; @: y {
0 q' p: _0 X O/ h: H; R1 {* Q2 v& {- u, n* `4 Y C! d- Q1 g
char *str = "1234567890";
; N) R3 B) b! A8 k4 b; o+ {2 k# F) t
return SysAllocString((BSTR)str);* K' V8 P; p' @: M& @( r
, C" v4 l! K- f. U6 l. {7 i }
& i. }1 [3 F7 o) x, M/ Y, y$ {/ \+ @& k; r# Z8 h
或者参考一下VB下调用GeTComputerName的方法.1 o( A% K( ^9 [" Y
9 P6 ~6 h2 l1 |8 ~
Q2 m5 ]" N( J. i* C, Q# Z) g! J( N4 R- K E: M. A
6 M' J! j) L' J" v& p4 }# f# }
+ o( Y$ V7 r4 \9 L7 { VC++与VB数据类型对应关系& |0 q5 N% E+ F% T' ?
) v. ^2 R5 Y. A" L" G) j! w1 M: K% XVC++ VB
3 M* J7 O0 y, ^short Integer% O# i! c/ f# G# a/ O
int Long2 P" `3 J/ j) n, D- i" Y, r8 O
long Long8 [2 X, T, j5 O+ D8 M. J* P* N! }
UNIT Long7 Y. C' |0 n5 R
ULONG Long% u% \1 \& b& G+ b! S" I
WORD DWORDLong
: u* f1 H" J- O2 LWPARAM LPARAMLong
: @( h) d% K5 i3 D/ VWMSG UMSGLong7 z8 v i- M3 ]
HRESULT Long" L. M) t2 P$ ?8 N, E
BOOL Boolean
$ [3 w, B& ?5 ~3 c. [COLORREF Long2 Z. p, T+ s* b) R, ^" Z1 H$ U6 T, T
HWND,HDC,HBRUSH,HKEY,等等 Long
/ z/ y: U% e9 Y, m0 N8 {0 ~LPSTR LPCSTRString
% t3 }7 g" S8 P4 b% G" K; ^* |LPWSTR,OLECHARBSTR String
% s- x, Y9 b3 a7 E3 q$ X2 ZLPTSTR String$ M1 g% C! E$ Y; p# s" ], ?
VARIANT_BOOL Boolean' b) p% ]+ `' D% V0 i& b4 n H9 M
unsignedchar Byte
4 c/ M @7 _5 d6 h' JBYTE Byte* W+ ^# @ B1 _
VARIANTVariant
8 I5 j G M7 W7 T4 v(任何以*或**结尾的数据类型) Long
5 s1 _9 Z- ]$ s' T- g/ D; ]0 t
% H5 r4 `6 p' B8 T& ~( C
6 w( S7 b0 V* Q# q1 m9 tc中的数据类型 VB中的声明 结果: E( U# w. A" y
! t( [5 A; s- P; |3 P: @ t
ATOM ByVal variable As Integer 结果为Integer 类型的表达式 5 w" M! y, ^- o
BOOL ByVal variable As Boolean 结果为 Long 类型的表达式 . i* N& _* H+ m. M- v
BYTE ByVal variable As Byte 结果为 Byte 类型的表达式 ) y; r! I: C7 u
CHAR ByVal variable As Byte 结果为 Byte 类型的表达式
' G+ g% {& W4 S7 B& hCOLORREF ByVal variable As Long 结果为 Long 类型的表达式 . v. f9 |- h& w# w
DWORD ByVal variable As Long 结果为 Long 类型的表达式 4 [2 F( G$ }0 ?1 i
HWND, HDC, HMENU ByVal variable As Long 结果为 Long 类型的表达式等Windows 句柄
5 g; i2 T9 x5 s3 h7 ? t; H$ hINT, UINT ByVal variable As Long 结果为 Long 类型的表达式
+ ^! t" |6 ~$ z1 s$ Z5 VLONG ByVal variable As Long 结果为 Long 类型的表达式 + [. B+ v1 x' _4 Q' m4 Z# \
LPARAM ByVal variable As Long 结果为 Long 类型的表达式
9 o& z; P! S6 o: xLPDWORD variable As Long 结果为 Long 类型的表达式 3 S% U( F+ R2 L7 m) W
LPINT, LPUINT variable As Long 结果为 Long 类型的表达式 . Z) N' c Y7 P/ S4 A6 b- W
LPRECT variable As type 自定义类型的任意变量 4 Y4 b7 j) v5 o# q1 m
LPSTR, LPCSTR ByVal variable As String 结果为 String 类型的表达式 - t$ I) A$ f& n9 z
LPVOID variable As Any 任何变量(在传递字符串的时候使用ByVal) ' c. H; q, q6 a; B4 T3 S# n: G
LPWORD variable As Integer 结果为Integer 类型的表达式 ; p" g# v7 _) U: ^. ]& a
LRESULT ByVal variable As Long 结果为 Long 类型的表达式
( A; n/ {1 I2 V; F! B! v) W YNULL As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer 结果为Integer 类型的表达式 ' U7 [9 Y9 J8 z' p6 S) @9 G7 e
VOID Sub procedure 不可用
2 v' P* s: c$ K( J) Z4 n% QWORD ByVal variable As Integer 结果为Integer 类型的表达式
5 u( x0 ?) p1 L5 g: N3 vWPARAM ByVal variable As Long
+ H6 I+ E8 `4 q5 D G6 f3 n5 }2 T: O M1 ]$ g5 x
|
|