PLM之家PLMHome-工业软件践行者

[原创] VB 和 vc 参数类型和传递方式 对应关系

[复制链接]

2016-12-11 15:07:57 2909 0

8

主题

10

回帖

146

积分

注册会员

积分
146
QQ
发表于 2016-12-11 15:07:57 | 显示全部楼层 |阅读模式

请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑 # k$ B2 G/ r, l* O) y
2 S+ n0 q' W: E4 k# I% m

* L  M: l8 V. M0 Y8 ?  v以下内容转载来的 部分亲测 部分未测试& q. s. w- ^! b  s, q0 Q' }

6 b6 B) |9 y! w3 ^# G) t% @8 K
$ k( O4 f# ]: E& d
! w# `6 H- r# P# uVB调用C DLL时的参数传递5 y- K$ x. F$ ]" R  K! X

5 F/ A" c% m2 v/ @, w4 U函数在C中的原型,参数类型和传递方式 对应关系   & u; j/ F: Z# }4 o4 C
0 w3 D" k5 h/ v2 x

% {" O+ i& u: _: M! ?5 ]2 B' F6 t; y6 s2 G& @6 C0 s
C DLL 原型         VB声明                 VB调用
5 m+ B( D7 J5 I4 P9 i6 J8 I$ ]( d9 t2 [3 a( L! s- T' x
USHORT a         ByVal a as long           Call func(…,a,…)
5 p7 u9 r# X' l* ~8 ]0 g* @0 H
) p$ [! _& p% H' @: Lint a                   ByVal a as long           Call func(…,a,…)
' p  z( {* Q  C( q$ |! y: [7 N
/ y: ^* `, z7 T( U) j$ Along a                ByRef a as long          Call func(…,byval a,…): s+ ?& i: a2 q) B2 [* Z' L! I6 Y

6 g; m  e& r4 G/ F% z* _: Jint *pa                ByRef pa as long        Call func(…,pa,…)
6 p/ B! `1 {- W/ {9 s0 n& k: B$ V/ b" V6 P: ^; [" F
long *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)/ H2 s. d$ a) a- Q% a' j

) o$ `, d# u. h7 |LPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)1 H. [5 `# w5 @. K4 J* D! P$ }7 ?9 P

1 v# c. [9 m; {0 s+ E  k% f" d9 V' wchar *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)! s/ B" I) O4 D6 T

( m2 N0 Y0 o+ W) W; R1 Ywchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)/ j+ ?  {: c* `, W
2 P% _5 Z; {6 a0 L0 R7 L) `, N; ~
struct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3)
) W; E! @$ R, e; ?/ H# \6 ^  b" T: P8 x( `. i4 J
HANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4)
0 P2 }& ~$ D) }+ s- v9 I2 H6 u7 G+ n# h8 I+ a4 ~/ z2 W' z! z
备注  
3 H2 j& _- N( o& a) u% d0 M- s* m- c4 a, h5 P0 a
1)不推荐使用此方式8 V2 Z+ y  V3 G2 z. J+ G

8 _$ f3 B: P$ e4 ]; z; ]" j3 n2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 504 p# f% ~6 h) j* G! x7 J2 t' ?

0 U! a5 t: m% ~3)用户定义子类型必须用ByRef方式传递, # H3 F8 o3 {, z% L, b2 D8 v
& e* l" o1 o; S& w6 Z5 z/ A
4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。 ! N2 d6 G8 Q: b' p" e; n1 N3 D+ j
# C3 b1 ?" K! K9 U8 k4 l
7 N& g! g3 p. X! V

2 f6 h% G- {$ Y4 L+ s. R7 E8 H
1 ^" E1 X, ~  A* M5 p
  h' n# c( H" T' C" O
* \3 D4 q4 J6 b1 c. H3 ~6 x& ?! n; n; C
数组传递     3 B$ m" M2 t* d1 A& {3 c* M; z( q

& I/ q2 `" g3 t* |% s  f- _        数组传递值用ByRef/ b! ?  {7 T3 M; c7 o
$ g. j- a& D0 }8 f& ?
        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。
6 l) ^5 p* x$ G6 t" w
0 D( W( f+ B/ j7 {  A! a& j& a( M: B/ U" b3 k

6 G7 P) e$ ^6 X- u9 x         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。8 p' }( b! |$ Q6 _, L1 n, Z8 l6 y4 p
, w  J! `3 b( [& u/ ?) f

" ^3 Y8 I& j1 F! w
; Y. q$ P) ]# N* Q9 g
. n5 u! u( E1 Q
2 i2 K  V. b3 K( W& r/ f- @$ j; bdll函数直接返回字符串
% u. G! j5 G9 U
" c3 R, \. c7 J" g* S, X. T8 U& E( i" C$ q
0 O7 g5 {0 r3 I8 v/ }
        VB下的字符串格式和VC中的char有些不同的; Y3 ^5 j' z% v' |; U

" y: C9 f" t( z        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子:
- E' e. E" n: R3 k! U$ z7 l; o$ g2 i' u: T/ A
# P3 b& K8 `2 A
. B0 g4 u2 y7 C) o7 |
     EXTERN_C BSTR WINAPI RetStr()
4 E9 {% W, b. l" _, K# F
2 a4 n  i) _1 a9 B8 j7 E     {
# A0 j* ]; _* ]5 r- v& c
6 |8 S, C3 Q& I- G8 j3 @             char *str = "1234567890"; , ]/ v# F% _0 K+ I. b

3 f6 i- j; n) ~# C* H             return SysAllocString((BSTR)str);' Z. A2 K, b5 d7 _5 T: G

# q7 T: c$ ?( @  M      }
4 U9 u8 `! M' f# p+ r) V8 S
8 ?6 T8 k% V2 @  H1 g/ f% x5 {/ }或者参考一下VB下调用GeTComputerName的方法.& j' p0 a1 \1 [* k& e% r
9 a  _3 M, q8 y
3 e+ j) k! U$ r0 \  Y

" z/ b0 i- @! Y  D
& W2 ]& u- M7 I, ~8 C; Y" ]* S6 K! t  _
  VC++与VB数据类型对应关系
' l! s+ Y  v3 I+ Y# J6 w0 m
- X6 ~( W2 v% L4 P2 D! wVC++        VB+ Z/ b8 v& ~1 p/ a
short        Integer
/ s3 U3 h/ a+ @! f: l' aint        Long
" ?0 [" ?7 {5 i: w) H8 U/ Qlong        Long2 F4 y' D2 L. J& C+ p
UNIT        Long& A0 R, O; o, \' @$ M
ULONG        Long
* _' `& D9 a6 p0 h, zWORD        DWORDLong( B. m, u9 L0 Z' O. I( j
WPARAM        LPARAMLong
+ X1 v- P( E4 O& CWMSG        UMSGLong
* V5 J5 \3 {# ^* U) g4 z0 C  Y# KHRESULT        Long
/ g( n/ _! ]& ]8 `; o* o( V: n3 \BOOL        Boolean
  {. c. Z! U0 X# ICOLORREF        Long6 v1 n$ ~! l6 C: g
HWND,HDC,HBRUSH,HKEY,等等        Long
7 y+ N' p" Z3 y7 ILPSTR        LPCSTRString
, F4 T0 }0 A* R, d8 v9 }! |LPWSTR,OLECHARBSTR        String
- N4 v2 w- S( @LPTSTR        String
. v) k  i" k5 \  B$ Y$ S6 X7 sVARIANT_BOOL        Boolean
0 V+ m4 M0 b7 C( s, |7 L' M7 Kunsignedchar        Byte
6 g* ?1 F; p9 H/ NBYTE        Byte
+ L% V$ h% m4 O5 T4 S/ j, hVARIANTVariant5 y# @, B. b: U  E5 s6 Z* M
(任何以*或**结尾的数据类型)        Long
( Y+ q- ~. K" e8 a2 ], y
) W+ \6 V# D: b( g3 `/ `* f
1 c1 Q& w; w) E8 ^" B% i6 v4 \c中的数据类型        VB中的声明        结果: p. j3 L) C3 f; ], t- U
                   % F' W$ i% Z9 F) c* }7 n7 C8 r' `# o% \
ATOM        ByVal variable As Integer        结果为Integer 类型的表达式
; F1 R" u3 x7 C) ~* L1 m% G9 cBOOL        ByVal variable As Boolean        结果为 Long 类型的表达式 ) }( W/ n+ Q5 d5 H7 D4 C( `
BYTE        ByVal variable As Byte        结果为 Byte 类型的表达式 ; T  a" m( G7 ]( ^2 S/ i
CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式 " l6 @7 a. g' E% ~/ N
COLORREF        ByVal variable As Long        结果为 Long 类型的表达式 5 E' @/ d9 n1 \1 s# \3 N
DWORD        ByVal variable As Long        结果为 Long 类型的表达式
) `& ^6 W3 h- u! X9 ?4 a. MHWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄
5 V8 B7 S$ j/ G/ kINT, UINT        ByVal variable As Long        结果为 Long 类型的表达式
0 Z8 \' {* w( O% ?; l* A1 bLONG        ByVal variable As Long        结果为 Long 类型的表达式
' j  X* J/ }% s4 w6 m$ ]% E) U# XLPARAM        ByVal variable As Long        结果为 Long 类型的表达式
$ M  T0 b  Z# aLPDWORD        variable As Long        结果为 Long 类型的表达式
5 G# ?  w& p. E  ^8 c* ALPINT, LPUINT        variable As Long        结果为 Long 类型的表达式 * n5 g9 S$ _6 |( f2 U1 g: j
LPRECT        variable As type        自定义类型的任意变量
) V/ E+ f7 ?2 I% `LPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式 3 x- R4 w+ d1 b- v0 [0 x7 c! |0 G
LPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)          ( l. e, `! q; S6 r" T4 O
LPWORD        variable As Integer        结果为Integer 类型的表达式 " I, S3 V" f9 A3 ]6 `) X
LRESULT        ByVal variable As Long        结果为 Long 类型的表达式
/ J  q8 F8 Q8 j3 _+ \NULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式 ; A. H' G8 m* J+ w3 M, B
VOID        Sub procedure        不可用
0 t. C! _  O; l% ~+ E+ ]WORD        ByVal variable As Integer        结果为Integer 类型的表达式   B# N6 Y4 p1 Q- y
WPARAM        ByVal variable As Long& a' ?- Y) N" l! I$ d% s* ~! f5 W: I
# r, I# p* ^6 j( W4 V2 ^( o
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 注册

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了