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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:07:57

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑
; Y% \# r  v. h7 s, N! O& s0 Y4 G. h& e
5 D' D% }% W3 {% M& n( |
以下内容转载来的 部分亲测 部分未测试
( ]2 X8 B9 c0 z0 F+ r6 j! g. H& I/ M. @( F# Z
0 L2 g+ n2 j- i4 [7 W7 |

( j. `. k* @% H6 _VB调用C DLL时的参数传递
. H2 [4 y# {+ C8 W6 h4 P8 [" n
' K% d* {' \9 A% J. ^) q( u3 C8 S函数在C中的原型,参数类型和传递方式 对应关系   2 `7 p# _7 A6 b# t

' I) N+ K% Q% S( \3 |& C4 F) y; a8 R

; E) H, c- {) ]$ X6 _C DLL 原型         VB声明                 VB调用
' Q4 m2 p$ s0 [- S: f+ j
+ Y& @! x8 i; V; M7 yUSHORT a         ByVal a as long           Call func(…,a,…); W, _1 i& u0 h+ G) k- G1 o
7 }  g  H0 M6 H- Y3 n" b
int a                   ByVal a as long           Call func(…,a,…)* z0 z) _% t) G8 H

6 O: D, \3 ~4 H1 S5 Q7 L. ^% G3 b" plong a                ByRef a as long          Call func(…,byval a,…)/ C( t0 l& |. |  J3 s
1 O. @, a- \' J4 Y+ U
int *pa                ByRef pa as long        Call func(…,pa,…)
% `; J( D# Z. R& m6 T' i8 A3 I5 F6 ], g
long *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)4 @5 k9 a3 m  U

' n2 E, B+ d. B$ ^* {LPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)5 |: X9 Q* D) R

; U" S4 t+ X3 L; Ichar *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)% L1 l2 Y; P* }: E2 r8 E

1 P7 N% b+ O( V( H6 L3 N1 vwchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)
, S0 v- m6 y/ }9 [6 ^! f4 p. G
2 R! G: H: y$ z% W- m5 A5 Qstruct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3) 7 g+ J* [( l( o# F' p5 X  g" e: g, ^

% m9 q' H& Y) G: u' y. k$ J% b. kHANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4)
/ g" A6 y- l' r+ R. w1 l; ^0 O3 Z4 g
备注  
# [* X. y3 y* @" Z
  i1 w) E, K% |0 @8 c( v- X! C1)不推荐使用此方式
7 h3 G8 W0 ~# P8 h: S9 J) _. n" |- K  t/ P4 F+ l" r
2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 506 E6 }4 \/ ]: s  h

0 ]) s+ M# n3 g( X+ A# m3 {3)用户定义子类型必须用ByRef方式传递,
, a1 h4 _  a. h" I
  H" S; [' R- i. L) @. s4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。 6 w6 W) A5 T3 R0 j' \9 Y
, K) _7 {5 u4 I$ `) V; B( X- U
9 F: D% i# s! H

+ j0 r8 X! f/ ~' y' ?1 V& O9 |
/ r% n# H+ h, `# m6 q9 d0 m* Q" `6 n. N! E  Z3 |: _
8 J' W1 U7 @! ]5 b1 n

: t1 N* W& Y5 _7 ]. w4 x数组传递     
- g) j. p) W' z3 C! I' ], |3 R& O- A
        数组传递值用ByRef1 J) _; T% e8 U; ]' @, }) V
! S* k% q$ s8 w7 m4 X
        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。4 Q, j! N5 `- O3 E" [1 i  K7 _! e" A

4 j: i, J5 j) S2 ^4 r1 y1 @0 Q( Q9 I7 p' i
* @" A& p/ S, F+ O$ }- S
         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
: }7 ^8 F2 n% ]6 Y3 ~8 f
+ \" j& o' n9 F2 r3 _( B# C8 `, e, v9 N! T6 g( m1 D9 r1 X) s. j
' G4 M& y$ N" o* Q$ O

4 I4 M7 D, I% S' b, Y6 w" h8 J( @7 |
dll函数直接返回字符串
( R% {0 y# m8 v- o: S. r9 D
. `  \4 i  ~$ A% B9 f* ]
2 Q- g: d7 V2 t1 A, q  D- j" k5 N$ p
        VB下的字符串格式和VC中的char有些不同的% z  f/ I5 d( f0 P  j3 ^

2 a' ~6 |" \4 x0 v        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子:
% z) q  n$ s" A' `
  y% f. ?4 j6 W, L. }0 ?' n
' ]+ ~2 K: C# n' {2 Z/ w* Z# k: x" c6 I( O  `6 f
     EXTERN_C BSTR WINAPI RetStr()
9 F2 c/ J( Q- P$ a- N6 n$ r; D3 {3 T: V) c: Y" R
     {
( j, b7 g5 z& Y- [4 w% y2 b" C9 P  `* c8 E* B4 M- K
             char *str = "1234567890"; 8 G% b" F2 v' a4 C/ f6 v' V3 t  f

! J/ O, |" e  U9 V             return SysAllocString((BSTR)str);6 }! K$ l2 x! A( n2 h+ H" A8 \

# b  O" }! k8 _      }
+ N% C0 y; P2 ^5 G
1 I# J2 \6 [  d, @或者参考一下VB下调用GeTComputerName的方法.2 \6 }) L; H% M
! K! h% D- ~& U: y7 H  Y- U
( w% A$ b: M' u( Z" V6 s
+ f& {- J; `: B- ^* p- }5 h

& S- q  H% e4 d8 |) r# V, e) {! Z, a2 p
  VC++与VB数据类型对应关系6 Y6 z$ R( F+ t+ e$ h; y; c6 u

$ i1 ]4 O- y2 P1 x. b8 T. f  X+ B7 ~VC++        VB& k: @* u' t; L; D) N' u1 p( y# `  h
short        Integer
; \( h! d; h; _0 x1 Q* _) Qint        Long
7 Y8 Z+ m  o6 X; p, d% ^long        Long) y; i2 G! S$ q; n% P- Y. n# n
UNIT        Long
3 e1 z3 ^% L, R$ U6 nULONG        Long/ Y; ]" I4 T- ]: X$ _
WORD        DWORDLong# o3 O8 @( O* G4 j/ z4 I
WPARAM        LPARAMLong
4 p  r1 Z' m% B2 B$ D3 o1 bWMSG        UMSGLong
" x6 A8 {! L- h) w9 hHRESULT        Long
' ]; X, _9 P2 H) g/ L( ]BOOL        Boolean. w- s2 m/ O- {8 j: U
COLORREF        Long
3 H4 O$ V$ z- ]* b# S! ?! u* eHWND,HDC,HBRUSH,HKEY,等等        Long. \" B2 E, X% k9 h! g9 X" o4 G* P
LPSTR        LPCSTRString
) w8 i' A2 s5 \4 ~LPWSTR,OLECHARBSTR        String
1 V- P( M/ R# R' _LPTSTR        String% x* ?- e8 p# J7 ^! p
VARIANT_BOOL        Boolean' A  {7 s+ @6 M- q7 L' ~
unsignedchar        Byte7 G4 s$ W$ Z" S7 m- K
BYTE        Byte$ r: V' S; Q9 H+ a$ Q7 }0 D0 a* e' Z" N
VARIANTVariant
0 i  q* q# r( Y) H- S. H" ](任何以*或**结尾的数据类型)        Long+ U1 x% F5 W4 k& r

4 s& C: s$ M( `1 \3 v
' }+ [) R6 c9 D3 E. Vc中的数据类型        VB中的声明        结果
) Y- A+ q; ^$ [+ D                  
; ~: b5 ~$ k2 j/ |" [+ OATOM        ByVal variable As Integer        结果为Integer 类型的表达式 0 ?7 z# K7 d2 ]$ |. |
BOOL        ByVal variable As Boolean        结果为 Long 类型的表达式 6 {0 \: C6 Y9 \9 g+ P1 g
BYTE        ByVal variable As Byte        结果为 Byte 类型的表达式 ( y, T! P# D# I4 ]& [+ c; M& {/ r
CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式
% }4 p) N9 d" ^4 q2 w1 @4 NCOLORREF        ByVal variable As Long        结果为 Long 类型的表达式
1 h( _+ Q& ]  x; q. b/ x* F( ]DWORD        ByVal variable As Long        结果为 Long 类型的表达式
: ?# F+ D" N' M# X8 t. l3 oHWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄 ' N/ |! C0 z6 I6 k8 U
INT, UINT        ByVal variable As Long        结果为 Long 类型的表达式
# s9 n# P! ]! {LONG        ByVal variable As Long        结果为 Long 类型的表达式
* _; l5 z0 `3 l5 P; g# mLPARAM        ByVal variable As Long        结果为 Long 类型的表达式
; K5 i/ r% ]* g% z( `9 f  J; `LPDWORD        variable As Long        结果为 Long 类型的表达式
. F1 ?( h7 I. u% f' a! i: B0 D% LLPINT, LPUINT        variable As Long        结果为 Long 类型的表达式 , a( R: v% D3 G0 b) |
LPRECT        variable As type        自定义类型的任意变量
4 r+ o  W8 [0 b! v+ G- B: bLPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式 4 E5 F7 }" I: _# R8 v
LPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)         
6 o) C3 y/ Q" F* d: _LPWORD        variable As Integer        结果为Integer 类型的表达式 * J/ |" q& t. K. ]
LRESULT        ByVal variable As Long        结果为 Long 类型的表达式
. b3 _! f* U- Q) n- @NULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式 7 Z7 n3 s% z5 w, z7 n$ P. p3 h
VOID        Sub procedure        不可用 * X, b" [5 Q% g8 Z
WORD        ByVal variable As Integer        结果为Integer 类型的表达式 0 G. c2 h" E- b* r# g  s; v
WPARAM        ByVal variable As Long/ R/ ~. H8 E* M* S! B# }* Q  l9 A
3 c6 m4 r5 P# A4 N# ]* S
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了