PLM之家PLMHome-工业软件与AI结合践行者

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:07:57

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑 + x) f2 C# Q' C- M8 h# T
% F. ?6 _! J* N) n1 n

1 H( ?5 L8 X: n8 g' l" N以下内容转载来的 部分亲测 部分未测试4 a+ o6 T" C6 f# n) A( U! {8 M
# V7 H7 n% c# x) \0 \
6 v: n+ z+ ?3 z& E

8 r- ]% [  a) D5 v' K7 f$ aVB调用C DLL时的参数传递
- o( E/ B* N! e0 ^8 [# E" `
2 k0 x' A3 S) P5 u/ `! y函数在C中的原型,参数类型和传递方式 对应关系   
6 X) K: d) @( e3 h1 `- ~) O9 e. a
9 f" ~4 j( O/ @4 Q& _! ?- w2 c5 X6 R, P8 W. k+ I
; I3 i# U; ^& x
C DLL 原型         VB声明                 VB调用
' ^8 B1 I4 J( F6 K! ^: i& b1 S) z% G2 F; v9 g
USHORT a         ByVal a as long           Call func(…,a,…)& s  N4 P$ _" W. X; ?8 k5 W# B

1 ]$ h  Z% n* O* n$ Dint a                   ByVal a as long           Call func(…,a,…)' |; N) w* N2 J
: ]  X* X% _/ c5 I
long a                ByRef a as long          Call func(…,byval a,…)
1 Y: S/ ]9 J4 G* R8 @( u( l  s% p) j! P* R2 d% J+ ?5 `, Q, b7 h* @
int *pa                ByRef pa as long        Call func(…,pa,…)
+ j  v, E2 [$ u( p3 w- v: U+ l0 k
/ {3 z( y9 f0 Z  V6 |8 f% s* D  Glong *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)9 _) m  Y2 c# t$ e, e1 @: u3 N

: m  k2 _7 M* W$ h) bLPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)0 c/ X6 D% G7 T6 A$ i4 J4 n  g
5 a- u6 [' p! G5 a% l4 i$ W
char *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)
' Z2 L% n* ~( L
. }0 _6 R1 @' ]; |! q% d3 Ewchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)2 `  P8 f) v% e) k  I% _5 I8 E

: L/ Z  ]$ c' B. F6 lstruct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3)
+ Z! j7 k4 r* \3 Y2 L
) |/ d2 s" H/ f2 q4 @7 iHANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4)
1 ]! f) U9 o9 \' B8 ]% Y( u, b4 }! `, z
- U: T; i" Z2 G' o9 m, g- {备注  & z9 \( F# q4 d7 D5 |. k# ^0 x
: h6 q3 X9 C' s& u2 x# x6 ~% _; z
1)不推荐使用此方式/ e( z* G7 f- o* o, v  r
. _3 {% k: }: y/ N' K
2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50  J$ V7 y+ s) C9 y, Y

: S1 A3 E! d% y4 _4 g# _3)用户定义子类型必须用ByRef方式传递, & g+ ?  n& @7 P- g4 K% B
5 k- o8 U5 Z/ I) V
4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。 - `( f3 v' J, f# |8 V

1 S/ |3 q8 Z: q; A0 y4 K' k; U
6 K' M9 x7 B0 i
; M. a: x6 U7 n/ |& C
' b7 G* `4 N$ h% {4 a) ^  w7 r( a9 }; i7 \7 z
- f3 w6 Z7 O# O! U1 h  ?8 x
5 s" f" g  T. s/ H5 C
数组传递     
# Y. `: p+ R2 c, R! f5 b5 ~$ U/ [+ X
        数组传递值用ByRef1 P5 C$ p% B) Z2 K7 x& H# ]

5 k7 x. w3 f9 H: \- r        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。
8 f, I- g# ?( U! [( W4 V. K$ c* Y- x7 [7 N- K8 |# _6 b
0 L- r3 r/ J9 y' b/ m$ N+ h: v. Q
2 s* F0 ~; f1 n6 o& Q9 B+ d( X8 O- g
         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
5 c! q8 X- e3 i1 ~9 k- p. H7 i' Q* d9 p: w
$ u- F( g; }7 M8 o2 n1 A! n3 b1 T

' M. j2 X8 H3 w* l8 Q9 L* ~$ h# N3 b$ }1 Y0 K( Z: v

0 r) ?5 `) K* _9 B! j( ydll函数直接返回字符串
8 G2 S, A, H! g$ H$ e& o) E; l3 O/ k. I" t4 j
/ i: j' U7 e2 d! a( m
8 M$ ]) {5 S' O/ B
        VB下的字符串格式和VC中的char有些不同的7 y: W- }4 I: h$ t

9 n1 H2 r! [' }/ v+ W$ i        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子:
# m# r# g" W" s: H$ z4 K- A9 F& K! R- W2 t! K
0 _8 @& \  {, B

1 P) X* }7 H, L" p     EXTERN_C BSTR WINAPI RetStr() 8 k' S/ `3 W' w2 p7 L

  e. c' K5 Z: f6 @     {
, z+ G; U2 u' c4 G: q9 F
: m6 ~; d; d( b- l/ p9 B) ?             char *str = "1234567890";
0 O: x* Q! l2 O3 u3 B9 F4 N: ^2 N4 f8 M% m7 U% ~
             return SysAllocString((BSTR)str);( r! P' a7 h, S; _) b' h* i5 K
6 ?: O4 C+ h/ w# E0 w
      }   E) q% S' H  j. P
8 \# B# t& w- P5 a
或者参考一下VB下调用GeTComputerName的方法.
4 H( r+ V8 q& I3 Y: k9 Z
- x# F8 f4 n* z  Y: C5 Z+ w- }( b) w! ], O: P6 P

7 C+ B4 E3 M1 ^+ \
2 ^! N4 f" L- l1 l# s4 v4 o3 j2 z" y" h6 u( \2 M- @- B
  VC++与VB数据类型对应关系4 F- M9 a, Q" h) b" ~$ t

1 [5 O, z% z2 p' W' G. B9 q! i9 zVC++        VB# ^- Q" q, S2 l1 s: G/ W
short        Integer) x# P- q4 r  g
int        Long
) {3 n1 u" d/ s+ q( a$ ]long        Long
2 k* X3 a9 j+ ~UNIT        Long
7 e2 p/ ~7 R( u3 V: VULONG        Long
) u) T3 W7 J2 b( }WORD        DWORDLong
8 f+ e. W  i9 u7 {7 y9 A1 ]% jWPARAM        LPARAMLong' ~% T* P  R  o: C7 _0 x& {
WMSG        UMSGLong
) C) h# l* o% A5 }* ^  d: sHRESULT        Long  J0 Y8 F2 [  P) g- d' h0 s
BOOL        Boolean2 h8 \2 V' l. V7 \# b0 U8 ]& @
COLORREF        Long# n7 E+ Q2 g# k% v
HWND,HDC,HBRUSH,HKEY,等等        Long
) w$ h4 m  X4 W: S# U* ?; wLPSTR        LPCSTRString
2 ]2 |9 a5 d9 R$ fLPWSTR,OLECHARBSTR        String
4 T* d! r$ s/ V4 l& hLPTSTR        String
+ [( L& j/ ]8 |4 e' b, M  QVARIANT_BOOL        Boolean, r8 G- M+ [8 f- w8 ]$ r3 e3 O; g
unsignedchar        Byte! [7 ~" w: c" C  o
BYTE        Byte
. U9 b6 E# P5 S, \VARIANTVariant
! }4 K% G7 a) ], l  I5 \. H+ n9 S(任何以*或**结尾的数据类型)        Long
/ D: A& D. f) L7 c: d& C( V. r9 E0 i( z# Z
7 \* f1 u' V7 Z* ?" o+ Z
c中的数据类型        VB中的声明        结果
& w, ~8 U6 D% Q& J1 [$ s. Q                  
5 k/ p4 n. t+ k7 S- O0 pATOM        ByVal variable As Integer        结果为Integer 类型的表达式
/ m: Y$ v' F4 U* o! M4 J8 p& OBOOL        ByVal variable As Boolean        结果为 Long 类型的表达式
( d) N$ b; i" _8 S# tBYTE        ByVal variable As Byte        结果为 Byte 类型的表达式
; b" d% b/ R  Z+ m$ YCHAR        ByVal variable As Byte        结果为 Byte 类型的表达式
6 z; r% N! u& N: V/ _: H" u  C! kCOLORREF        ByVal variable As Long        结果为 Long 类型的表达式
; W% n' T1 F  a/ B  ?3 fDWORD        ByVal variable As Long        结果为 Long 类型的表达式 ' r8 L+ Y/ k( t4 A' ~; A2 ^
HWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄
- E+ ]+ B5 b7 |# D+ tINT, UINT        ByVal variable As Long        结果为 Long 类型的表达式 " E- u% V8 e  \4 S
LONG        ByVal variable As Long        结果为 Long 类型的表达式 2 h/ _4 x  v% u% x. z: E, y
LPARAM        ByVal variable As Long        结果为 Long 类型的表达式
( y* |$ y1 I. dLPDWORD        variable As Long        结果为 Long 类型的表达式 ' H) ]; k& i6 w
LPINT, LPUINT        variable As Long        结果为 Long 类型的表达式 6 I' I/ e0 F' a5 Q# ^
LPRECT        variable As type        自定义类型的任意变量
  m" c, ^7 L0 H2 n" w# z- I' F! rLPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式
/ a1 G6 Y( G( Q4 B6 g( S4 NLPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)          ) h9 |& F& C1 J
LPWORD        variable As Integer        结果为Integer 类型的表达式
0 ]  m+ b' o. s- P" x" X. tLRESULT        ByVal variable As Long        结果为 Long 类型的表达式
1 f/ A6 `  j; sNULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式
% u0 P; Z! r9 S; N8 lVOID        Sub procedure        不可用
4 P4 O& s7 E+ J4 r2 i+ [* pWORD        ByVal variable As Integer        结果为Integer 类型的表达式 / [' W: A/ `. M+ V0 Z
WPARAM        ByVal variable As Long( I6 x5 M$ E( e% @# k+ c

4 c8 ?4 Q7 v) l% s( B; r( Z" \& S) J
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了