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

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

[复制链接]

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

8

主题

10

回帖

146

积分

注册会员

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

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑
0 _) E, R4 g/ T2 A0 w& s. c, s4 H
& l0 }; |1 `* x- Y
8 O7 @3 O! d9 q+ i& R# S7 R以下内容转载来的 部分亲测 部分未测试
# G# D. G, r6 ~  w
( M1 C& U' S/ E! E* n
& ~/ S$ a2 X! J7 D1 k9 T& a0 ]' e; r; @: |+ ?
VB调用C DLL时的参数传递" L( @. m7 s2 b6 b7 f
' f% b! m+ S( f: Z8 {$ q. b6 O
函数在C中的原型,参数类型和传递方式 对应关系   
! Y7 M1 |( Q. O( w) H
( C6 t: o9 e0 e9 y# A, O: x
) p1 j* Z' g- f# i7 _, l) J$ _3 O7 g* \; l, f
C DLL 原型         VB声明                 VB调用
( F. [$ \/ }* O5 F# f& @' r; r* Q  B
USHORT a         ByVal a as long           Call func(…,a,…)8 Z( ]& ~" W! n2 C6 f

2 ?8 ]2 F6 e7 j  X+ Xint a                   ByVal a as long           Call func(…,a,…)
" \2 c4 {$ D7 S# C( Y
2 [% P1 e5 U2 k: I7 d" R! Zlong a                ByRef a as long          Call func(…,byval a,…)* b8 M, u* Y) f+ \
7 K/ i( B% H$ `6 r" H5 k7 m
int *pa                ByRef pa as long        Call func(…,pa,…); }! m/ S- K& m2 q" L! c

3 H7 a8 J) E2 }8 I! Jlong *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)
+ O8 |+ w+ W% ~9 h! N- w5 v& j. j: X" \# K* t* o$ |$ q* w
LPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)
0 {- U5 p% W4 K# x* W+ d/ R" v: R! w- c  m0 D8 Q
char *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)3 O. w! Y: O: t# O0 X

! b/ u% v: O' x$ |wchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)9 [* x  t, R8 _

- d% l& D4 I, |$ ?! u. m" ystruct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3) , n4 b4 R7 @6 E+ p1 ~

  e* p% J4 S/ M0 \. G0 vHANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4)
8 A3 o; m+ E: `1 }$ }
" f7 H% R, r/ X* W6 e3 g0 H" Z. Y( b备注  9 T/ B6 i3 n% \& U. U/ f* Q9 R

+ W+ f; Y# T% `) T1)不推荐使用此方式+ }& U; I* E: {9 C& {( J
+ N7 e1 p: {7 E" N$ p
2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50
. N; h0 m( W& Z( [2 f- x
. T2 T6 m, E, P  t( F3)用户定义子类型必须用ByRef方式传递, ! h4 R6 Q" |9 f- U1 ~5 z4 {
8 M9 ^! G5 @9 g8 U) a! Z; l  g
4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。 3 I( [6 G0 c& m9 ~4 M  y
$ m2 [# J- S) h  r# t

# z9 @1 n  I( W& q& M* y8 j
$ r; x& B4 f5 T( D* }" Y) O9 t5 x
& P; ]0 N& ~6 i& F) g! {
% J! i$ v% K8 x  ^5 y& D
1 P! @7 L' j! Z/ ?4 C. R9 B2 e5 N$ w
数组传递     # o4 L3 t* p5 Y: h# G

& @' {6 z) B* T! i        数组传递值用ByRef
3 t4 o% _* W+ C3 z2 T
* D# a7 E! }: L* E        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。
. _! K: R+ q2 v9 u0 W  U8 L
" M. q4 z8 S  \, X$ W' _- \( y3 a: t# l0 H

% o3 k" X' A. M' I! _9 s         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。7 z  a( r9 c& V; J# l

) ^4 @8 C6 ]8 C5 R% X& [& |# Y
5 o) d: }9 P7 n, [! G6 r7 Z3 N
2 L! c% w5 ?5 T
9 e0 i# t4 w2 C( K: H
dll函数直接返回字符串2 j6 O; E! Q% M/ t1 @5 Q+ M
  ]1 q9 T9 b( m$ t/ K

! M+ f' p! t+ p
/ B: G1 Z, a, m: p% p        VB下的字符串格式和VC中的char有些不同的; d4 Q* B4 X0 P0 s  a$ U3 x/ s
6 p5 R# v4 v* U% ~
        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子: 8 v  V# l3 d9 r: ]' v
0 i' \  i5 w) R
( \5 y4 k2 v/ [/ P6 F5 G) e% W' _
, D/ d! X  r6 j- x
     EXTERN_C BSTR WINAPI RetStr()
& j8 x2 l; d0 I% e1 n% s
& |, O2 R- o6 `, T  n     {
) j$ p' s2 r" ~7 N$ x( H+ ?' G3 J) e, @+ x5 ]
             char *str = "1234567890";
; o$ c) P5 z, p2 J
- Z3 X+ q# i/ n% E3 L  c             return SysAllocString((BSTR)str);
  Y- {1 H6 k' j  {+ X- Y4 @- n# ^2 h( D9 T* g* R
      } 1 |1 G: y1 @. w3 S
) J2 {$ H) r' C* D
或者参考一下VB下调用GeTComputerName的方法.
  O% K; _  R8 X- w  l/ \; |8 }8 H
- D4 Y# x! m- Y2 K8 k
: u  v) ]+ t$ o0 V6 u- J6 X+ B8 f, Y- n
% `9 Y  ]# w! w
$ l- H2 g( w7 ~3 X& j( I
  VC++与VB数据类型对应关系9 S0 r0 }# Q# u8 e; ?0 I# c% L

9 x/ o- ]8 J7 E+ I& dVC++        VB# t1 a" K4 Q0 K' |. h
short        Integer: U) [4 I4 a: `% A) t' q" o- J- x
int        Long: Y3 v7 e/ V$ i
long        Long$ ~5 T/ Z% O) c( p" L
UNIT        Long
9 q; t+ c. q# {$ M/ g$ V1 @" [ULONG        Long
, J/ P- _7 L: V) x' q, eWORD        DWORDLong
9 J' V2 W& {. F2 @# ]$ J8 m+ cWPARAM        LPARAMLong& G' o; ~0 g; [  l0 ?- r0 E2 T
WMSG        UMSGLong- N3 d/ r3 @" a4 U) R3 ^7 `
HRESULT        Long) r" o1 h# u/ F/ d: x" D, j8 k) P
BOOL        Boolean
/ }! U$ u0 J8 v$ i& ~& U3 H6 n' UCOLORREF        Long
, R( S7 a6 U/ F5 Y0 P2 d; vHWND,HDC,HBRUSH,HKEY,等等        Long9 d. a0 ?. ~1 v7 |
LPSTR        LPCSTRString0 `9 j8 f2 b, z+ n+ R7 Z: ~
LPWSTR,OLECHARBSTR        String; @+ D- B9 G& Z- J' U/ k# v
LPTSTR        String
. Y" l+ ]6 u: R% `# Y1 JVARIANT_BOOL        Boolean" T# o3 {& [- C' S+ X. U3 v
unsignedchar        Byte
% Y" l0 q& O+ \1 ]( l/ F: _BYTE        Byte$ w) V- w+ `4 _4 C
VARIANTVariant
) q6 ]- x& d7 t6 y( `9 t# Z(任何以*或**结尾的数据类型)        Long
4 T$ O4 L( B) Q( ?, b* y
& I. V- j% C5 ^' l" }" J8 k4 Y5 {' ^1 @8 x  w
c中的数据类型        VB中的声明        结果
2 w/ a( h$ L3 i6 B% n& U- z0 P                   1 |! k. P8 n) f8 h! }( B6 |/ u
ATOM        ByVal variable As Integer        结果为Integer 类型的表达式
9 W+ v3 P7 ~* e3 v# u* \BOOL        ByVal variable As Boolean        结果为 Long 类型的表达式 / a" _% |  N8 _9 b4 p
BYTE        ByVal variable As Byte        结果为 Byte 类型的表达式 2 ^* ~! b$ G; l; _2 y% {# r
CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式
* |& k* s' N; M# T: `9 UCOLORREF        ByVal variable As Long        结果为 Long 类型的表达式
( f* f: E6 J' O( W8 q/ JDWORD        ByVal variable As Long        结果为 Long 类型的表达式 ' L1 Y4 l0 P- T, D2 h" ?1 {
HWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄
3 H1 Y7 N/ S. y9 b: R: ~INT, UINT        ByVal variable As Long        结果为 Long 类型的表达式 $ E) `% J, x# i) R) I8 ]
LONG        ByVal variable As Long        结果为 Long 类型的表达式
+ m* D# g9 w8 c' p3 D* \LPARAM        ByVal variable As Long        结果为 Long 类型的表达式 . ?; p- q5 _; U: @, {8 E
LPDWORD        variable As Long        结果为 Long 类型的表达式
+ O' f) L  O6 J3 GLPINT, LPUINT        variable As Long        结果为 Long 类型的表达式 2 Y/ |' f# [4 z" R2 t
LPRECT        variable As type        自定义类型的任意变量
: I0 H' p4 c  x7 k# @& y  QLPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式
1 }( s0 B% `$ U* ?1 c: N9 E& G7 rLPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)          " U# D& F9 |( u7 }: c, H) l& d
LPWORD        variable As Integer        结果为Integer 类型的表达式
* s8 A- @$ V/ g5 o  a' N$ ~LRESULT        ByVal variable As Long        结果为 Long 类型的表达式
6 N+ A, B6 O6 ~, s% Q! fNULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式 5 b) Z7 c& ?0 {' r6 O# A
VOID        Sub procedure        不可用
, l: R- U1 c; E' O) z; e3 U* {WORD        ByVal variable As Integer        结果为Integer 类型的表达式
1 i) Q7 a" M& ^$ T: ^2 W, _WPARAM        ByVal variable As Long
- A- N* H: X' E* L9 Y2 Y
9 ~3 O: [- w7 V0 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二次开发专题模块培训报名开始啦

    我知道了