PLM之家精品课程培训,联系电话:18301858168 QQ: 939801026

  • NX二次开培训

    NX二次开培训

    适合初级入门或想深入了解二次开发的工程师,本培训结合ufun,NXOpen C++,大量的实例及官方内部的开发技术对于老鸟也值得借鉴!.

    NX CAM二次开发培训报名 NX二次开发基础培训报名
  • PLM之家Catia CAA二次开发培训

    Catia二次开发培训

    Catia二次开发的市场大,这方面开发人才少,难度大。所以只要你掌握了开发,那么潜力巨大,随着时间的积累,你必将有所用武之地!

  • PLM之Teamcenter最佳学习方案

    Teamcenter培训

    用户应用基础培训,管理员基础培训,管理员高级培训,二次开发培训应有尽有,只要你感兴趣肯学习,专业多年经验大师级打造!

  • PLM之Tecnomatix制造领域培训

    Tecnomatix培训

    想了解制造领域数字化吗?想了解工厂,生产线设计吗?数字化双胞胎,工业4.0吗?我们的课程虚位以待!

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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:07:57

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑 8 ]( d+ C4 F' B/ [5 n$ V' y

/ s; |/ C0 A' O
5 t5 x# `, J+ `3 x( o以下内容转载来的 部分亲测 部分未测试9 I# D- I) i3 E& S3 U6 |: d3 A" x( `: C

- @0 Z# ]6 j# D/ Y: S: U, x1 g! `6 ~! }+ e# F3 w
3 _7 }9 d4 Y4 R
VB调用C DLL时的参数传递# h0 a' h1 Q( Q' G( m& [  f

4 W1 \) N1 `5 z: @% }函数在C中的原型,参数类型和传递方式 对应关系   
5 m) b3 o: ^: [0 j  G8 r. R( j( t
- {! }- j% d# D, `- t$ k6 B+ @1 V8 V' b& f, [) B/ X. b2 g' c

) C3 d" x* [: T7 qC DLL 原型         VB声明                 VB调用
6 k! Z. n; ?  v5 c' r( ^* m0 A' j: F' C) e0 W
USHORT a         ByVal a as long           Call func(…,a,…)
/ t' C5 e$ }& w( q
; V: J* |6 a! qint a                   ByVal a as long           Call func(…,a,…); o' A3 r. H5 L" k, Y; c
+ E' |' H& V: X8 Q
long a                ByRef a as long          Call func(…,byval a,…)
4 r. ]5 G$ W8 p& r7 a! Q2 w4 t: b. y; r  |: l8 ?) T7 c
int *pa                ByRef pa as long        Call func(…,pa,…)
" t6 ?9 I) {; o* V- \$ [6 `, e3 m" k! b- H7 }
long *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)
, f5 n4 r" P4 z" h- z/ N- m
; T5 g) l- }; e$ w0 VLPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)& y/ p* G7 J& b! Q
5 @1 D' k5 o, s2 G' J
char *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)
* w0 s# R, U; T
- ]+ @$ u0 J$ Y$ w1 _wchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)+ ~! ]+ }: p& m# T7 n

. w. x/ J1 R, O' u, e; Astruct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3)
: u, X  T  Q2 [1 i) t4 m8 D0 M3 `9 K0 D( @1 C, ^4 A* J
HANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4)
' {$ r- B/ o, v9 Q1 V! Z+ V2 [6 Z; E/ G& `* P% G, J- j( \
备注  1 q2 M  I4 m. v7 q7 b' [, k/ o
5 ]) \! k. G2 P% i* B
1)不推荐使用此方式
. y1 q  @0 p0 [3 }5 ]+ `/ W9 p: @$ |: H: F$ X0 A: F3 o- s; E" o; i
2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50+ ]4 ^1 H! U  h6 R- @, s
" a: Z0 ^( J2 G! P9 c& f" [7 P, v
3)用户定义子类型必须用ByRef方式传递, / J/ }- W( }0 Z/ P6 ~  d* k# l) b

2 k3 E# G. i& B: o) t5 P7 t7 S4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。
  J6 i1 @3 R  J! o4 `2 i: m" Z  w  p1 B' B+ F, w: Q* H

1 G# [( Y9 E7 b
) f! a* {' x- |9 o1 o, X
7 q, r; k1 L. d4 M% Q2 R  n2 @& ]
, K9 o! h8 N+ s( G8 {
, I/ W0 `4 G3 M& V3 \$ K: e1 Q
+ o: n6 c/ s! ?) U数组传递     4 A* k! T) R. F: F) i  h6 g+ @& G

' g( }5 s7 d" b* U, C        数组传递值用ByRef" A( W5 @( q& M
, ~+ L& @7 c4 m( {2 `
        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。6 Q9 ~0 B6 ~: a6 Y" U
1 S& z/ k7 X# j, C

/ Z0 g9 \6 x3 ~+ Z* b8 x6 d4 G) h, R: J, ^" S
         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。) ^# A0 ]) x0 Y4 j
6 G2 G4 d0 t1 `& m) E3 ~

0 Q; C' S: Y/ K
0 T/ F3 e. M: x* t- k5 Z( e1 B4 d' y) B. b! m0 g0 k3 v
: i+ \& u8 k+ o' J3 ]( S- O' Q: a  H3 j
dll函数直接返回字符串. M! |& P  w* m3 i/ B7 I  s
0 Q# G& A; X( i5 @( F
! T. h6 D: E- E- U
3 x. \9 f1 i" E
        VB下的字符串格式和VC中的char有些不同的
( t6 `- a+ M! s8 U) P! [
& N# @+ ]# M6 z' z+ p. I6 W        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子: + z) B4 B6 h+ n  C

  u, w6 E( O* p" S
! w3 N  M" Z4 O- k+ L0 X, c4 t6 G8 J3 Z1 E  A7 W
     EXTERN_C BSTR WINAPI RetStr()
4 P4 _, T/ P: @$ u) {
- N$ j: G9 @- J7 W9 i6 w! @     { 0 H, `9 l. d; C  Z# n
( a" `) v8 O" z6 w& T8 y) {+ V
             char *str = "1234567890";
7 u8 L( H, M9 w5 c. r) I) m% V7 r6 T* w
             return SysAllocString((BSTR)str);& R  j4 V3 _4 q5 [5 o
( ~# o3 w6 l& x" X. D6 S* l: o
      } 5 P( u5 j6 R/ _1 b5 W5 V0 x" j

" g9 S3 K! k$ u  n  r: U4 I% Q& E或者参考一下VB下调用GeTComputerName的方法.' U; K+ C! P2 ~
4 h; f. Z7 t" R. a4 f, U6 m% ^
: |5 h' t7 `9 l3 ?( P
) Y4 t# L- c/ K. k6 ~9 {; |

4 F, a3 |& }1 T) }0 A5 L9 M. A9 e- |- U
  VC++与VB数据类型对应关系
  b+ n1 h  N3 ^( N% }% V/ j( e- o& W
0 g: N6 O; O5 S2 D7 iVC++        VB) w4 u4 b4 a3 h1 J
short        Integer( k" g2 y: G' B% w$ v6 r
int        Long
, C2 i# ~4 B3 elong        Long2 J1 {, g' s* D/ L" F8 K- ^
UNIT        Long9 ]. r* q3 V* p- x& }& v4 S, q
ULONG        Long, l/ [5 r: E0 T, P: v: `2 N7 e1 `
WORD        DWORDLong
& w3 ~! X/ ~  c- R. i4 d4 H& i9 f9 |! [WPARAM        LPARAMLong
" j# X  @: w% L6 d7 a; KWMSG        UMSGLong+ e/ b8 n( h/ J( {6 _
HRESULT        Long
$ @2 i' t: E# ~  \" o: }BOOL        Boolean
( L. S" W5 @  O( s: ]COLORREF        Long
! `1 e7 J3 @( F8 s9 x( H- fHWND,HDC,HBRUSH,HKEY,等等        Long1 `* i8 N% x# A! u6 I. v# n
LPSTR        LPCSTRString
4 @8 M" z# W$ ZLPWSTR,OLECHARBSTR        String
+ _; l8 V# }  p) O+ h) I" L% |' p" ]LPTSTR        String
5 s: g, d5 K2 OVARIANT_BOOL        Boolean
- m0 }! ~+ u+ b, \2 x0 V. E7 J8 runsignedchar        Byte! L* P. X3 \, w/ l# O% W7 c
BYTE        Byte
7 v7 z* z: n! c9 @" l! xVARIANTVariant
1 `. u4 Y" Y, ~# f4 z* t2 h(任何以*或**结尾的数据类型)        Long
6 H+ n* F9 A/ r+ S( _0 m1 g" s9 O
2 u: j0 z  T; t5 ~( ?1 G; V
% n6 d, {! W: P5 W+ B4 I1 d2 R& ac中的数据类型        VB中的声明        结果
+ f- j8 O( C: W& Q- M/ M" }) p                  
; o9 Y/ p4 g$ Q- I/ cATOM        ByVal variable As Integer        结果为Integer 类型的表达式 ( D9 m1 V6 b* ~
BOOL        ByVal variable As Boolean        结果为 Long 类型的表达式
: d; z; o7 e- X7 s; [4 WBYTE        ByVal variable As Byte        结果为 Byte 类型的表达式 4 J- z5 g$ i5 }- k  R
CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式 # S' y( H! p- ^& q( ^; Z4 g4 ^
COLORREF        ByVal variable As Long        结果为 Long 类型的表达式 " D$ X( g% Q, [1 h  Y3 D; j
DWORD        ByVal variable As Long        结果为 Long 类型的表达式
  z/ G) b( u! B" O4 gHWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄 4 ]3 l6 m) N% `* D1 L& ]
INT, UINT        ByVal variable As Long        结果为 Long 类型的表达式 ! }* @, C8 O+ i* @
LONG        ByVal variable As Long        结果为 Long 类型的表达式
! D* b4 s. t9 p( DLPARAM        ByVal variable As Long        结果为 Long 类型的表达式
9 o9 g3 v  a  Q- z$ n' z7 gLPDWORD        variable As Long        结果为 Long 类型的表达式
2 E8 ?% W- h5 m2 [  y# i# l: @LPINT, LPUINT        variable As Long        结果为 Long 类型的表达式 $ f7 Z& y0 R0 r9 A+ K
LPRECT        variable As type        自定义类型的任意变量
$ Q8 w" ]( J; k( O. H# i/ a) d) lLPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式 # K4 J5 T& T8 r9 A2 j7 M* B
LPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)         
" `% E. O' f3 O4 e1 T# ULPWORD        variable As Integer        结果为Integer 类型的表达式 . e8 ?* k8 g2 q2 n9 A3 H% J
LRESULT        ByVal variable As Long        结果为 Long 类型的表达式
  f0 x: M+ |# g4 l( e4 zNULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式
$ S$ G5 M9 ^7 I1 ~* |VOID        Sub procedure        不可用 0 P* n5 r/ B  U8 J3 {; Z
WORD        ByVal variable As Integer        结果为Integer 类型的表达式 8 Z' L. ~1 V; r; b/ {2 g
WPARAM        ByVal variable As Long# e' ?) x( r4 |- Y
. k4 ]" A; D2 R
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了