|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑
, B8 m- |* L( |
. _( `1 I. J/ q# ?: k) T
# F# V `7 q5 x$ W) i( i以下内容转载来的 部分亲测 部分未测试
. a* ~7 s, q0 a/ J7 \8 X
' V! X" Z4 r% d( T6 F
3 a2 w* ^* a( q' p# U+ _, e1 C2 E2 A1 z0 u8 Q) r( P! o P7 W
VB调用C DLL时的参数传递6 J% |; {3 x0 Q8 C
2 T7 n2 H" A2 \函数在C中的原型,参数类型和传递方式 对应关系 5 ^( Z& N. a+ o8 |4 E
" p( C+ M8 C6 T2 G
5 c3 P8 q q F7 M2 E3 `/ I) u% {/ w$ T/ L$ X$ D$ b
C DLL 原型 VB声明 VB调用7 `7 V! g b8 L- n" `, p+ @) e
: k( B5 _% ~! P4 @8 y* H$ L6 E0 A! D
USHORT a ByVal a as long Call func(…,a,…)
8 c% @& |! P! T# f9 t5 t5 y
9 A! M6 ~4 m/ Q5 e# tint a ByVal a as long Call func(…,a,…)( {/ ]; E( R+ D$ W8 B
! n! B" r k, Q- p3 ^1 |long a ByRef a as long Call func(…,byval a,…)
: t2 T- V4 C9 F
! g0 t- ?# _6 N4 ?int *pa ByRef pa as long Call func(…,pa,…)& b4 K" e) V; |& M" V% x: f/ G
$ e' ~7 y) R+ e" Vlong *pa ByVal pa as long Call func(…,varptr(pa),…) <---------(1), T' M; c# Y$ H; n8 |& n
! Q9 s4 m3 g0 F% X9 X9 cLPSTR lpStr ByVal lpStr as string Call func(…,lpStr,…)
. H" V! r) |3 l# J" l7 g2 K2 q: A/ V$ b% ~! z
char *pstr ByVal pstr as string Call func(…,pstr,…) <---------(2)8 l) ?0 M1 u& o; F- O9 [" n I
: \ D0 B2 r' S! L
wchar *pstr ByRef pstr as string Call func(…,byval pstr,…). Z `# s' c7 I; r( e# v
. R& \3 O7 t: S$ }4 U) R# }struct tagX *p ByRef p as tagX Call func(…,ptag,…) <---------(3)
) ]: z3 l# W" Q- m5 c2 n$ t; f: r: o6 c- G
HANDLE h ByVal h as long Call func(…,h,…) <---------(4)
) l0 @' T- z& J* E# v0 ^4 V0 M7 [! `6 ^. Y
备注
( q% E M) g' `/ u* e- z* j) l* [
8 N1 O$ i9 s. P" V. x) d" N5 g1)不推荐使用此方式
; ~" H* h, I \6 z: ~, }0 \ e8 i
8 h5 C$ I8 u2 P, b2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50
1 r6 N9 [7 `* T r( k8 y4 ?( s' w7 |
% ^6 o1 {* p8 c3)用户定义子类型必须用ByRef方式传递,
( o3 a y) C- E3 K9 z" b" h- J5 H( T) w& L. U
4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。 R0 _3 d7 b) O( j+ {& y/ D4 j- O
0 M1 q! ], [/ \! [( Q- k9 p3 C$ |
+ s3 I0 o) X" g3 X' V
- C e( Q& e- ~! G: E
& Z9 |. Q- x- M9 T: P S7 R
# N4 J8 a# j! M1 O* `! g
( o" _$ z0 `6 T( w; S数组传递
# h$ S& f$ A0 Y% G3 r* A6 ^0 U3 f3 |2 h$ U# v# e
数组传递值用ByRef
1 h* O0 n4 V! T1 [) r
2 n+ w7 M/ ^) m3 l- j VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。
) l R, D7 R/ N3 A3 o
8 [2 o) X" u( y# M6 ~# C0 f/ a3 y6 B& {/ M9 Q2 N* G4 x
M* F, |% T9 ]% B# X% ~4 d
VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
( V; G% N4 Q& v. r: e) [: \
: O( B" C5 F2 V& H" y+ w9 Z/ [8 d0 Z: S7 l8 p) w% ]
. o9 i9 B. j9 A7 M9 c
9 W7 U( ~$ _1 g' ^! p% M
8 H( W: `5 e+ L' Y- _
dll函数直接返回字符串
* N# ~6 Q/ `" \; x N
1 R+ R3 Z5 h* L1 J4 O0 B% C5 |2 R+ u# ]) o" g
- a# X. a0 T) Y0 y5 n; r/ e4 O0 @
VB下的字符串格式和VC中的char有些不同的
1 _2 k3 v; {% v! F4 b0 x( w7 i- Z
直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子: * w! U+ L" k0 c; D# u
3 V. ]5 Z1 G+ v* Y9 _0 u/ X
/ z$ A* ^% i8 w2 w! x+ k
) A! f2 L& U' f/ [ f/ y1 I EXTERN_C BSTR WINAPI RetStr()
- d- h0 A- h5 u* H
2 v9 p- Q# u. g { ) ?" L% w% P6 L" {
5 s8 L$ K- d1 Z, Q) I, E+ M
char *str = "1234567890";
3 Y& M3 F1 `. W/ R' b
4 c% J3 H7 V# D return SysAllocString((BSTR)str);
/ l8 w6 S4 h4 [" p3 S" M6 i0 V2 d' m
}
3 l- }& K6 K& T" ]/ s; v0 r A! s5 `9 [
或者参考一下VB下调用GeTComputerName的方法.; ]0 B0 q7 Z7 L7 |. L i! P
0 P$ C: j) n2 Y. T0 C0 d, W' x* j3 q5 S V( b6 S" j0 n; D
2 g: R- h2 ~6 F0 @/ p3 i: {
n; z9 C! w1 y8 ?
$ N8 J0 \. ^% W( Q' l/ g" d VC++与VB数据类型对应关系1 p* T4 N: e P Z) x8 @
& g3 I" n8 [' e% d
VC++ VB
6 R( K- \% E; B- sshort Integer
7 x' {3 D% w0 ^: [7 D. g; L$ fint Long
z ]- V6 [. n% V: Slong Long
# s8 c6 D/ |- @7 }+ F; e6 dUNIT Long
2 W X0 B& `; Y) kULONG Long
- r/ d& @: w# `) ?; n% v$ I' IWORD DWORDLong$ J, C2 H8 G2 Q% u
WPARAM LPARAMLong* G% u& [8 e( l, |2 t
WMSG UMSGLong/ K4 {0 J, `! w8 H; J
HRESULT Long
5 A, g' F+ P) b3 pBOOL Boolean1 b: j! {8 [: Y1 Q$ z0 z; g
COLORREF Long
( _, S/ X x; A9 S! x$ ^HWND,HDC,HBRUSH,HKEY,等等 Long. _8 E" j! ]9 x6 X- D7 {- K, r
LPSTR LPCSTRString
9 z3 R6 n2 A- ]+ XLPWSTR,OLECHARBSTR String
5 I2 y7 o8 h" e9 H+ V$ ]& aLPTSTR String
* _( F z6 t! G0 e7 Z" `5 SVARIANT_BOOL Boolean
, o+ v( Y; `- F" N$ B0 o% J/ V: aunsignedchar Byte
' r6 S9 B! A9 @. NBYTE Byte
& @3 ?: V: {, w& FVARIANTVariant
0 m& c! w9 F# [2 }(任何以*或**结尾的数据类型) Long
' g: z: }6 b6 k7 ~
! w7 |6 z# m1 D) h2 O; c) H+ {2 n. Q/ z- S7 [
c中的数据类型 VB中的声明 结果5 r+ g$ E% W% s6 F5 v
4 K( U8 v3 t0 @: z" P. T; {ATOM ByVal variable As Integer 结果为Integer 类型的表达式
/ Q, G) Q3 E: M( D: {. D* v/ ^BOOL ByVal variable As Boolean 结果为 Long 类型的表达式 ) o C9 r/ a8 ]$ @) `9 i* h r2 H
BYTE ByVal variable As Byte 结果为 Byte 类型的表达式 / }: i: N- L( Z$ v7 B9 n) x8 i
CHAR ByVal variable As Byte 结果为 Byte 类型的表达式
# l; U6 z0 b: [( y/ A1 RCOLORREF ByVal variable As Long 结果为 Long 类型的表达式
2 m4 r( E: \3 ]) _' @9 DDWORD ByVal variable As Long 结果为 Long 类型的表达式
& T; j4 i: A' X* ^HWND, HDC, HMENU ByVal variable As Long 结果为 Long 类型的表达式等Windows 句柄
- S! o5 B# |5 l$ i2 PINT, UINT ByVal variable As Long 结果为 Long 类型的表达式
/ F' N2 c: l! l; `; [( n5 A" {LONG ByVal variable As Long 结果为 Long 类型的表达式 & v+ N' `, K% |. K% X
LPARAM ByVal variable As Long 结果为 Long 类型的表达式
! t8 [6 z/ K7 d( a; YLPDWORD variable As Long 结果为 Long 类型的表达式
2 L2 J/ S* B: H, r5 F' T/ zLPINT, LPUINT variable As Long 结果为 Long 类型的表达式 5 R% {# j4 |9 C* u" c7 [
LPRECT variable As type 自定义类型的任意变量 ) f# u: q3 L5 W4 l0 c; W. A
LPSTR, LPCSTR ByVal variable As String 结果为 String 类型的表达式 + j* F* d+ b; o
LPVOID variable As Any 任何变量(在传递字符串的时候使用ByVal)
6 B8 g6 r& M! D% q; u% `+ SLPWORD variable As Integer 结果为Integer 类型的表达式 D7 [! @4 o) z# {- ~
LRESULT ByVal variable As Long 结果为 Long 类型的表达式
# F7 G3 _) w1 f9 WNULL As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer 结果为Integer 类型的表达式
' ?9 p) b, y Q6 M3 D, BVOID Sub procedure 不可用 6 C0 [ f+ g9 Z8 u$ Q) i
WORD ByVal variable As Integer 结果为Integer 类型的表达式 $ Z- q/ D0 O+ x" X" |
WPARAM ByVal variable As Long
4 w7 c- B; |" w3 Q" z) A5 j* |1 l; Z) ?7 K. w
|
|