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

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

[复制链接]

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

8

主题

10

回帖

146

积分

注册会员

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

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑 1 F$ F$ c" n, `- q# p9 {
) G, X/ y0 y6 F9 E0 i" q3 `

' Q' M0 M' Q  f" ^9 b; ^6 T5 \以下内容转载来的 部分亲测 部分未测试% s4 [- ~* I' @" I) O$ z' W

( A0 l4 v: O+ T( X' Y! {0 D: I! f0 F# @# q
% w; J9 m' ^4 J! N  o5 i; c  w
VB调用C DLL时的参数传递6 w# p. i/ Y& k/ T

4 H% H$ o: b5 M$ d6 Z) e- ~函数在C中的原型,参数类型和传递方式 对应关系   $ S  w3 i8 E8 J9 {

6 x* X+ \- E  o/ b- G7 W9 F# J1 p
2 w7 \  U0 j: R- \$ c1 w7 S' U
C DLL 原型         VB声明                 VB调用
7 j% u" n" p2 c9 L$ B* C& [0 ~8 n
- i# Z2 f" j# K: @! p/ bUSHORT a         ByVal a as long           Call func(…,a,…)" X1 m* h! F3 M" `  `8 Z5 y: y

. W# O/ i2 x" ]( Q" hint a                   ByVal a as long           Call func(…,a,…)6 {* ^0 P3 |8 s2 a- m3 _

+ W2 s) D+ U% g. rlong a                ByRef a as long          Call func(…,byval a,…); K: g* @8 m9 g3 |% ~# Y1 `

; @* d) K  [: H2 }int *pa                ByRef pa as long        Call func(…,pa,…)
& s7 k7 B. S& ]
( q. V/ P& [3 q  L+ clong *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)
+ m7 \4 f# K9 H8 v3 h
' i- z0 J. A/ Z- T" B9 H+ vLPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)) |3 c7 y& e' i0 a9 L0 L

0 }( l/ F6 `8 O8 r0 Bchar *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)
$ g: }/ \$ C& |  x/ R
$ J9 o5 i5 L' p/ G5 Y5 R) qwchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)
3 N, n& P: k1 Y  }. p- o% r7 u! y
- l; m9 b, p" H! T- N- ^, Bstruct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3)
' v6 [. J: G/ L. k0 k+ X
% L  v& }" T6 tHANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4)
7 e6 {% h5 ?' b2 D' W; n
4 w" {& f6 U& d& B2 o3 y备注  
) j9 f2 ]5 x6 u; A5 T; i0 M$ n/ p+ H" ?; R2 W  A+ r
1)不推荐使用此方式4 Q& o5 b3 D  F

! [5 m* P% H* t- |4 s- v2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50& c3 x& \" }9 x# W) [

, k( J7 i: z# j' B( E: }3)用户定义子类型必须用ByRef方式传递,
5 t9 R0 K- F# `3 |5 x- Z4 `, c; G! v3 ^$ g8 E
4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。
' S7 i) f; o: K
2 m- }# R: ^% w4 G: |/ x6 W2 U2 I$ Y! a: ]; O

/ W, o! K( g2 r, d# F: h7 U8 Q( Y' r/ q8 `' d3 K
0 j8 ]) I6 g, g/ G6 h2 T
- ?1 i. t# ]: }1 K  G5 }

& y6 J+ U, T9 b" j3 J. T数组传递     7 E& T* ], q6 u! _6 V0 j
7 l( ~$ r2 X* z( H- R1 P) Y
        数组传递值用ByRef
3 u7 E/ P) v% Q1 P& r% f
! z, Q9 b# P& B6 p' v& U1 a        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。+ G7 N+ A4 }. x
! P. V( N4 B4 u

* Z" ^* M3 ?. c; q' }* V/ H) ^% ]
         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
. m! m3 f$ t, M2 q! s7 k. M0 z6 b6 G
! w4 A( p: q: }6 ?
( N3 b" Y  B& G) z% V7 Y( Q) L
) M- w8 E4 H% k; P3 h5 o. L
5 x( X/ y' N: Q6 |2 j
dll函数直接返回字符串- ]( [/ v7 R; Q6 d* R' A2 X7 V; S
3 |9 {/ p/ I7 q# Y! J+ i/ k

! Y! Z- g! d5 _# L) {) l( j1 v" d4 M( w
        VB下的字符串格式和VC中的char有些不同的
6 o: w( }1 h' x0 I/ N( o! n/ @7 y9 e* Y) R+ ~, Y2 l6 v, G
        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子:
, K/ h, c3 H' y4 J. S. n4 O# E7 U4 s& j* p

( j1 M& V0 r' K. P# p9 s# A& k, u/ p- r9 J4 d
     EXTERN_C BSTR WINAPI RetStr()
) w( ^9 F1 c$ K! u  Z/ I# k& a; I  J: Q) o0 ?% J
     {
* H9 l3 R5 B5 J0 r6 g$ t; q( D* P. c
             char *str = "1234567890"; ) ?! ], S8 Y# {% T

; P, S7 ?8 c2 D- a             return SysAllocString((BSTR)str);6 d- @  J4 C6 A6 B, {$ M
( o6 G* x3 x+ u' n) i0 i
      } 5 f4 U. U( z0 z2 Z* _4 b5 ?& d
& Z" k: g0 h) c+ Z
或者参考一下VB下调用GeTComputerName的方法.
+ X$ g: k7 w8 ^: G
1 V6 [- [. U! `: y1 i2 S* N$ ?. W; `( c& }. j6 B
5 N9 o) a* F0 K

( y6 F% {: X$ ]# k. L; d$ n- x2 n( K  Y2 Q! N) j. X% o
  VC++与VB数据类型对应关系
! d/ f' t5 ~' R# f. K- K3 W- k' |) P, u" b
VC++        VB
# A& ~2 |8 P. e( I% r! lshort        Integer
2 ?+ T5 u$ l& g5 N% y0 Kint        Long
  k, }) l1 X$ t5 llong        Long: ]% Z8 o$ }! q0 R
UNIT        Long+ C! s1 z- ^9 c. N5 G) w
ULONG        Long& Q/ t0 Y& a% q3 M0 @4 m
WORD        DWORDLong
% P3 A3 Y& J6 w+ w% xWPARAM        LPARAMLong
0 F( X! }# V6 y4 a8 mWMSG        UMSGLong
2 E2 U: l7 r$ n4 D( z* WHRESULT        Long+ T$ ^3 ~& K4 H- E! n
BOOL        Boolean7 K7 n3 f7 w7 }& ?9 G
COLORREF        Long! @8 Q4 d/ b& m3 ^- e3 I
HWND,HDC,HBRUSH,HKEY,等等        Long
6 q6 `( k! R8 [4 F! mLPSTR        LPCSTRString
- N, p0 s' e+ @. {0 jLPWSTR,OLECHARBSTR        String8 y( H7 G9 o+ y+ L4 W+ ?
LPTSTR        String+ L& E7 i5 v7 d# u! g
VARIANT_BOOL        Boolean( u9 g7 e" W$ ~8 J8 W; `2 {
unsignedchar        Byte
- c" t; h" P. p' y& M+ iBYTE        Byte
" Y5 l. E$ x1 p$ Q& G& Y- y6 m* z2 pVARIANTVariant. o6 m$ v$ S" `; n. I2 b  D) }
(任何以*或**结尾的数据类型)        Long, R8 S$ [! ^8 }2 Z! Z; X
% V  A- s3 m3 r: g

& G- ?: R; L, Hc中的数据类型        VB中的声明        结果& O9 \7 T/ l! b* A9 n5 ~8 f  ]
                  
% ~2 _8 E+ {8 h# g* |1 wATOM        ByVal variable As Integer        结果为Integer 类型的表达式
0 \6 D: T4 l3 ?, j0 O% tBOOL        ByVal variable As Boolean        结果为 Long 类型的表达式
. Q& T' e, X: ]( sBYTE        ByVal variable As Byte        结果为 Byte 类型的表达式 ' j- l5 M7 y) f; g% J4 @5 S) q1 R3 }
CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式
1 K5 s! H/ @. |1 y5 U( j3 ?COLORREF        ByVal variable As Long        结果为 Long 类型的表达式 : s6 J$ O& \9 p4 n% k4 h
DWORD        ByVal variable As Long        结果为 Long 类型的表达式 " h) L) L( [3 T
HWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄
! v% C+ p: u* U  aINT, UINT        ByVal variable As Long        结果为 Long 类型的表达式 % G, R' s" D0 V% h
LONG        ByVal variable As Long        结果为 Long 类型的表达式 * t' Y! O- e* r1 U1 t2 K
LPARAM        ByVal variable As Long        结果为 Long 类型的表达式
! x8 p1 E1 H; c( `& P- sLPDWORD        variable As Long        结果为 Long 类型的表达式
5 u, a, v1 i" }$ c4 }% n5 TLPINT, LPUINT        variable As Long        结果为 Long 类型的表达式
4 K' C9 l9 q% ALPRECT        variable As type        自定义类型的任意变量
8 O: z  u( X8 s5 m2 dLPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式
2 z2 w' k# n* A3 fLPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)          2 q9 W/ C( t+ T9 B7 X9 B
LPWORD        variable As Integer        结果为Integer 类型的表达式 . p1 p. n1 R7 q  h+ w* _! @
LRESULT        ByVal variable As Long        结果为 Long 类型的表达式
7 d( W0 m# d8 V, fNULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式 ) k# \: |- X/ w) [" V" ?" o
VOID        Sub procedure        不可用 ( g9 @  F# c1 R, b9 {5 _, s$ w  G% a
WORD        ByVal variable As Integer        结果为Integer 类型的表达式
3 T( d6 r8 I+ `' k  l4 z/ N' DWPARAM        ByVal variable As Long
5 I8 W3 V$ f9 n5 E/ `2 E  ]2 L, i! A+ g# f
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了