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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:07:57

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑
& m1 x) `( W- J3 s
& i0 F' z' T9 _0 K: D8 x; M% c4 K1 x3 n3 i+ X4 t' i# M
以下内容转载来的 部分亲测 部分未测试
) u5 i- u* F5 y( `4 V( z* a; g  c* J( c" c& B

. p* j  |; t# Q) N1 H7 i) V& i% _' C9 F9 {7 ?6 d- G1 U3 D
VB调用C DLL时的参数传递
2 ^" I4 n0 r9 H' u, \' W& ?2 E  s6 p
函数在C中的原型,参数类型和传递方式 对应关系   
. t8 l& t" m0 Y  O2 J. N5 n9 P2 `- e5 s; l* p- f

& [; Y' o% T- A& A! O8 j
6 h& n  w, n+ b6 q9 u: w& N2 w6 \C DLL 原型         VB声明                 VB调用- x5 w" z  \2 H5 d( Y6 ~! h8 u& H1 }

3 s0 ]6 Z  s) U5 J+ @7 uUSHORT a         ByVal a as long           Call func(…,a,…)
. ^- d7 I& }: m) k5 U: g% U& c$ p, s9 {( z3 @3 T! }4 W
int a                   ByVal a as long           Call func(…,a,…)
" o" t! j" u, ^2 \
/ t. Y/ l# A+ z: _4 }" clong a                ByRef a as long          Call func(…,byval a,…)
; ?9 J# k& P: s" n" k
1 M. Y5 Z! D6 ~5 U& b3 o9 E# wint *pa                ByRef pa as long        Call func(…,pa,…)
& Q4 i& D+ X& [. A0 S) }: A
# @1 v% q7 |/ @: |- tlong *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)
6 E+ M7 \! z, [$ a  m" x# S4 ~2 I+ L/ `: f5 W  X
LPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)- O% B' T5 _& d1 z" i9 h' L3 K

7 G+ v. m0 N+ K4 S+ W6 V2 G, wchar *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)
- q, E1 G9 \$ E- M- e" U. t) N  U2 _6 r- g1 X; F7 L
wchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)5 _/ X; @8 g! s8 x. W6 H

& ^6 a* H$ O/ D+ B' O; ^- Z3 h" sstruct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3) 0 i2 A6 x, f% X7 \# k, [, b
3 g3 L1 y5 ^. {8 p3 N2 o
HANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4) " u. w1 B5 p# \* R8 k% a1 j  b

! i& x! l+ l8 d5 [备注  5 \: `4 X9 n& b7 `8 \

! ]* n8 `! u: V5 K0 Z1)不推荐使用此方式
3 p! u6 j6 ^) `2 V% B. A; @+ u, l8 V5 b# r9 Z
2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50
2 D. z1 }+ t' M, S8 ]/ g  `) L
  |4 {' W% Z; R, d( l2 x3)用户定义子类型必须用ByRef方式传递, # e+ I4 n3 q9 V& t

5 l/ i2 ]1 L- ]4 ~( f4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。
6 \7 T  ?: P$ x. Z/ V( t
( `* p$ O% w( W: `' j1 n9 A* b% J1 h4 g7 }2 B

( W2 ?7 B! p7 V. Q; B
2 W2 l( r9 [& t, b6 l& m
: g# U" S$ @- Z& U" m* x5 `
7 i, {: ]2 m. x% n5 ^  N* B" C9 ^6 S5 W
数组传递     
1 z( X+ Y( Q( Q1 ]% V7 u6 d+ j! I7 Y/ U: v8 S; b" Y- I
        数组传递值用ByRef1 h$ b8 r0 G' [, z2 U9 C% ?. h' f
1 W8 z. _+ R* X1 @4 _0 g- Z2 b* ~
        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。
* v0 @0 a1 p1 P" a1 R  e. h2 l
( [- H% T. _+ U2 K% e. `2 ~# T
4 R# V  u4 H7 v
         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
% p$ G; r# t" ~3 [# N" b' y, G/ R+ }. k, w$ e0 h2 M
* {3 x* @3 S! J" p) B' n" L) l
) G) y8 Y% \8 b! d# f

! O# n, C3 J9 _: K# ]/ Q, a  R# c2 q6 T1 F7 @
dll函数直接返回字符串
; Y' A9 L( x! U* T, i, D
$ a% P$ v( @$ G3 E# [4 G4 e7 E, u! v# N6 {2 ^
- Q2 R& N. P8 m8 T, B0 i: C
        VB下的字符串格式和VC中的char有些不同的
- [9 z( w( k7 ^; V7 V% U! Z9 A$ [4 }- \1 q: q, y
        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子: 5 s" e" U8 T" t2 ~) f' o2 l
0 @9 `, @( m6 L- R
% c! s- C/ i3 }
' M- e% A' r6 U1 ]( x( j1 c
     EXTERN_C BSTR WINAPI RetStr()
0 F% U9 \2 c& t( e1 R8 w" `* a& |& ?! j. A; n
     { 6 P% E% P0 e6 S, y. F" r5 K

9 W+ B9 L1 r4 q% j             char *str = "1234567890";
; w! [! ?2 }2 W. x
& f' D, B: ^. i* t, h% \8 D$ F" F             return SysAllocString((BSTR)str);
; m* f( u) O6 T9 y, p7 b$ a# K. n  N
      }
! _6 _6 ?% {! q
7 J1 x# R  H+ ~或者参考一下VB下调用GeTComputerName的方法.( K) R; A6 R( x- Q

: E$ w% G9 W& {6 j6 ]$ R) q4 x
; q* c3 ]: p( ^; v+ E4 }& U  o: x, E. d, ^7 d

0 Y+ [! |0 f5 J; [7 c. y
3 ~7 V; O; ?9 b+ q  VC++与VB数据类型对应关系, N8 r( R$ F  a7 g( h6 I% j
) n8 _) ], p# \
VC++        VB7 ]3 s3 @8 d% Y. y( b" A
short        Integer
0 Z$ `4 j7 D( rint        Long8 E4 L6 J( P, v9 A1 a: B
long        Long
% R0 h$ [+ n& u$ o* j. T" uUNIT        Long3 d6 P& ]5 S$ t2 M0 S. F2 r# z! Q
ULONG        Long
1 E/ Z4 m- c$ @WORD        DWORDLong
9 _: U5 p( Q/ C5 `7 j$ kWPARAM        LPARAMLong
; o( [/ Q) ]& o9 tWMSG        UMSGLong$ ^8 D8 Y% V/ ]( C
HRESULT        Long
% Q) h0 ^+ Q4 D" J, J6 Y7 jBOOL        Boolean
- J4 u5 \( R, S$ }1 f# s3 xCOLORREF        Long
. o: ], |3 t+ h7 w) C* R: t4 {: iHWND,HDC,HBRUSH,HKEY,等等        Long
9 f7 b4 S/ j2 E5 p% DLPSTR        LPCSTRString2 x" |, k5 L6 j; F
LPWSTR,OLECHARBSTR        String
, n: {. k  o! @. |LPTSTR        String
. x7 p6 S, c: A- _% s6 h* GVARIANT_BOOL        Boolean9 q0 s/ J3 {$ s5 k, N/ N; X5 m, l5 x
unsignedchar        Byte
& a& |" X$ Y! @5 mBYTE        Byte. r) D5 n2 Y3 K: q- Q) j# o
VARIANTVariant
( V1 {+ q: \# d/ T) d& p! T, M(任何以*或**结尾的数据类型)        Long6 Y6 l. D9 u$ ^' {
4 C! x" M; _5 |

! [; R! n% q' E4 B) Mc中的数据类型        VB中的声明        结果2 P' }, g* k$ C* t! p
                  
; r/ a0 u: k& f8 u% RATOM        ByVal variable As Integer        结果为Integer 类型的表达式
, \$ d$ |( l3 x2 y, a4 N8 mBOOL        ByVal variable As Boolean        结果为 Long 类型的表达式 4 D% _! \/ u7 o6 ?/ C
BYTE        ByVal variable As Byte        结果为 Byte 类型的表达式
- \2 K, C, m$ k( M$ [+ I+ G( A! `CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式 ; Q- r8 C) o. ~# `8 U* G
COLORREF        ByVal variable As Long        结果为 Long 类型的表达式 ) i( d% g8 o/ z( q. E$ o6 Q
DWORD        ByVal variable As Long        结果为 Long 类型的表达式
  Y7 P5 l) k" ^7 h4 M( R& Y3 pHWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄
5 g6 C) S% _% l7 ?5 bINT, UINT        ByVal variable As Long        结果为 Long 类型的表达式
0 k5 w  Q- n  ELONG        ByVal variable As Long        结果为 Long 类型的表达式 . \4 e+ v  E7 Q2 N
LPARAM        ByVal variable As Long        结果为 Long 类型的表达式
; u  w% x9 l# d- cLPDWORD        variable As Long        结果为 Long 类型的表达式 2 ~$ Q4 a# u$ I1 W) {7 d
LPINT, LPUINT        variable As Long        结果为 Long 类型的表达式
3 Z# U5 Q2 a/ F, `! [: TLPRECT        variable As type        自定义类型的任意变量 " G) b) ^( m7 l! ]4 d
LPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式 * A5 S! Y. ?  j- V
LPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)         
! t# l+ ?8 y- NLPWORD        variable As Integer        结果为Integer 类型的表达式 2 D: r3 H8 e0 [" ?
LRESULT        ByVal variable As Long        结果为 Long 类型的表达式
6 S& y* g* ^( _- \, nNULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式
2 }0 F# ^, r# w0 vVOID        Sub procedure        不可用
" y* A+ m# Z, o6 F, y) C& wWORD        ByVal variable As Integer        结果为Integer 类型的表达式
& |0 z  ]% C* Y/ j4 M& S' _WPARAM        ByVal variable As Long6 a9 c. i3 z7 Y. K9 p" t( {

+ M! z* s4 `$ @" B- D% h1 }+ q  _
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了