PLM之家PLMHome-国产软件践行者

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

[复制链接]

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

15757753770 发表于 2016-12-11 15:07:57 |阅读模式

15757753770 楼主

2016-12-11 15:07:57

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑 6 f& R5 j7 @, {/ T7 H4 J

; `6 }. j$ |/ i8 t, ]. y" F/ J
) [1 l/ R9 R$ ~  ]# ~以下内容转载来的 部分亲测 部分未测试
$ U* A6 z% [9 A" O! A8 L6 ~7 ]- h5 J! E$ R
) N/ ~: [0 T- }7 [" ?
) X+ h, F0 I( [) d4 A% F7 z3 S. g# C. F" C6 K
VB调用C DLL时的参数传递$ {& T, U3 a) k3 X5 Y

. M: |# E; X% L* V! a# p6 ~函数在C中的原型,参数类型和传递方式 对应关系   6 N! i0 x/ U) o- W- Q: g! M

  V/ h. z, ]4 e0 o5 ]/ W% E
. H. k5 V$ z( [  S6 V: u6 Y7 R6 K" L9 j3 y* R
C DLL 原型         VB声明                 VB调用6 X4 W2 |# V3 x* B6 H

: H' N& T2 Q( z6 B$ m2 P( b0 bUSHORT a         ByVal a as long           Call func(…,a,…)6 l- {3 b3 N) s( b6 h" I4 L! m. ^

+ p% {8 v7 N. eint a                   ByVal a as long           Call func(…,a,…)
1 [3 }+ ]- y1 Q; Z
2 a( [! l' h7 Y" c, h& Vlong a                ByRef a as long          Call func(…,byval a,…)
& l8 G4 G& s$ L
7 t8 L, s! S; A8 {* c4 Qint *pa                ByRef pa as long        Call func(…,pa,…)% m; N+ t$ o& C* I# f

0 F. O) E" ]4 }' K+ m7 Jlong *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)- V% o% u0 Z+ [  ~* e% H5 q6 A$ F
0 ]- M4 l1 X* q$ ]
LPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)
/ d  W2 z5 z/ ]  t* ?2 i9 ~8 @7 ^
" t2 d. u6 D( Jchar *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)! [7 @# V0 I! B; e; p$ y6 J3 H4 |

+ ^. d: o. |7 W9 P; x6 dwchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)
$ d7 q1 h/ ?. `& ]9 l; b8 o1 |
struct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3)
- u, C- A& h- X8 L, b
" r  V( ^! g9 @3 J+ S% Y) Q; zHANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4)
4 ~. l- o7 \8 R
% ~  v) p% N; v' i3 m9 P备注  5 B( A+ o& b7 s8 i/ W9 W3 g8 H# q
7 i# C" L8 o, y8 Z: }
1)不推荐使用此方式+ I  }2 S+ X: i& M
$ q6 i; {) u$ T: N) W% X# g" M
2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 508 I. K7 B1 @% U; ~
- u4 t/ }; K4 O$ ~5 A" c
3)用户定义子类型必须用ByRef方式传递, 5 A0 C7 A9 V% U4 H; I2 E" [
5 B2 [* ~4 e) w7 p( @
4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。
! o9 W2 j; |& ?! l; D3 n9 c& j  B' j9 J9 C* `

. j9 V6 w2 u7 E) `6 r+ I+ e' A& A9 x( }! `3 t- D  r/ q
! _+ z- ^, t: i
  ^) T, R/ J+ [0 E5 Z

4 }" F) P2 M& X; N0 J, h! Y9 S) y/ [0 S- R# i% k6 W
数组传递     
- R, e3 ^* ]; K5 H, \" {; ^8 k4 b2 u1 z$ h; `2 P# Y
        数组传递值用ByRef3 Y) I; ?6 \! N* c
2 F2 `! V2 h  K: j3 |( J2 d
        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。; h1 d; y3 k$ D1 P
  b+ n% J3 @; C* h  q. d
/ `4 I# _2 h( ?  m; P
3 v- d, u8 Z% q6 u3 S0 o
         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。+ d1 e8 ?2 U7 J: b& E" i

2 o, ]9 z/ w2 t& A& m  H& p6 J" o. c- M* J: N7 d: X/ g

# V7 [; M  t% ]/ G+ q+ T6 I  [% {( ?2 R/ \9 v0 n/ A. b
1 F  o* }! j+ S' G: ]1 X
dll函数直接返回字符串8 C# R3 y( U! _2 v

+ U6 p; k7 O! v& d* L
5 @5 @, K- S2 ^* @0 a" o1 @% S( o* P: W8 J/ ?' p! A: J- k
        VB下的字符串格式和VC中的char有些不同的+ }- K( b2 u3 a/ I6 T$ a+ l

9 t3 H/ p& \6 c( H2 n4 k3 x        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子:
+ O: s; ~, t' m/ n, W# \' C
( ]6 C: P8 w7 Q1 c0 b( M, h/ C0 f9 G9 L# P* K9 f

# s+ Q/ w  F8 i: k+ I     EXTERN_C BSTR WINAPI RetStr() : ?. b4 f* B. k$ d* S7 s

! A5 X( T7 R& [3 a     {
3 @# V3 e  k) F0 W
8 i% R* a3 Q. w: [( r/ V- H! y             char *str = "1234567890"; 4 M0 r" F; @, h, X; n9 o% R
, X" \# t0 m5 o: ?
             return SysAllocString((BSTR)str);* A- `+ U2 {* s

0 T2 L" m! m) I) F1 m2 n; X, r& T1 ^      } $ y  W7 H# l* N/ x) r

; i7 e) F- @1 D; T5 I3 _0 x/ ?或者参考一下VB下调用GeTComputerName的方法.; M1 r& k) z5 x0 ]! C

/ o8 t+ v5 p& `. l
. }* Y6 h* Z1 T4 ?
; F- S) d* q& U5 K* Y: K/ K; G/ X) l. i4 ?' u4 [

# f% O9 _/ a5 q* O; I8 v  VC++与VB数据类型对应关系/ C( V8 y' U6 A( R3 z* H
1 Y$ a4 o- e( y9 d+ ?4 ?" v
VC++        VB
4 l" f# d+ E/ `$ s8 g/ Ishort        Integer
6 `6 `$ a0 ]# R0 dint        Long' L4 ?: [. W. K8 u  m  V7 h
long        Long
! X7 o' l2 }2 M$ @UNIT        Long
# p* j. T1 W# A$ _2 u( gULONG        Long% U5 C: w: g. Q; ^
WORD        DWORDLong9 Q  K5 W( W$ g) P# M" I" u# e
WPARAM        LPARAMLong
2 g% u& T* |/ o) j2 PWMSG        UMSGLong
  ~  {; [" s, Z8 D' _, jHRESULT        Long
6 J! c( Y3 w- P# D0 l6 rBOOL        Boolean
3 {. f/ d' }9 e3 H2 n5 eCOLORREF        Long5 A" G* s+ m2 v) Q" v3 o5 V; R
HWND,HDC,HBRUSH,HKEY,等等        Long
" S& \) _, h5 E9 b2 JLPSTR        LPCSTRString
% \7 o6 U. h7 k+ b5 u* B/ sLPWSTR,OLECHARBSTR        String
0 t* B" b0 N. q0 x3 Y" [LPTSTR        String( V3 ~+ X* z7 x* d* V8 n
VARIANT_BOOL        Boolean1 y0 n8 w9 g7 e; ?7 w6 D
unsignedchar        Byte
; m4 A- l% |3 I" V6 ~& Q" NBYTE        Byte
! ?, q: J7 }, F; g8 m1 \9 D8 XVARIANTVariant
: P' n* p$ q/ P" p) Q; u$ d(任何以*或**结尾的数据类型)        Long
) L, ?% o7 q0 `3 j/ O# h* ?) h6 R% i. N1 Z0 Y1 N0 j

" }8 C! `7 v4 R3 ?  E- |c中的数据类型        VB中的声明        结果: ~( s* w" t. p$ q) M9 q7 |) e
                   7 _( s6 a/ E; H4 C) X
ATOM        ByVal variable As Integer        结果为Integer 类型的表达式 / ~7 }/ [- M0 q: y5 f9 B
BOOL        ByVal variable As Boolean        结果为 Long 类型的表达式
' t7 n! h* K# |7 v( wBYTE        ByVal variable As Byte        结果为 Byte 类型的表达式 % H8 @( N- E3 p
CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式
+ h) D  _4 X1 F5 E* FCOLORREF        ByVal variable As Long        结果为 Long 类型的表达式 ' O4 j$ S) `8 c5 s6 Q' J7 B' S7 u7 j
DWORD        ByVal variable As Long        结果为 Long 类型的表达式 ) T4 c! ^4 E( |" [* N$ x: z
HWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄 / v8 z$ s8 o( {2 [$ x
INT, UINT        ByVal variable As Long        结果为 Long 类型的表达式
  b7 j2 _* G# m* t- L1 J$ ^1 YLONG        ByVal variable As Long        结果为 Long 类型的表达式
; H+ X$ o' r, |( R2 i$ a  p+ XLPARAM        ByVal variable As Long        结果为 Long 类型的表达式
9 M( d- `6 v0 l# v$ @9 KLPDWORD        variable As Long        结果为 Long 类型的表达式
  }9 J' h- E4 s+ c% W5 jLPINT, LPUINT        variable As Long        结果为 Long 类型的表达式
- b& f. j$ p  kLPRECT        variable As type        自定义类型的任意变量
$ G! ^8 J; p# `% [, c) A5 \7 LLPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式
; q+ y) F% i  X8 W( l. v' ~# C) jLPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)         
. d$ c, `% g  }, h5 [2 ELPWORD        variable As Integer        结果为Integer 类型的表达式 ' u; v1 @7 Q0 ]  z( x
LRESULT        ByVal variable As Long        结果为 Long 类型的表达式 % _  i0 ?4 n* i, n( q4 F
NULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式 + v, Q' @8 I5 `6 A
VOID        Sub procedure        不可用 ) ^' U- E- J8 b4 d2 M# r8 j4 L
WORD        ByVal variable As Integer        结果为Integer 类型的表达式
' c# [0 R" s4 I  eWPARAM        ByVal variable As Long
2 X7 Z$ A/ m5 l: A5 d& b
, E4 X2 _- v4 {. O9 \
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复

使用道具 举报

发表回复

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

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

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

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

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

    我知道了