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 2630 0

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

15757753770 楼主

2016-12-11 15:07:57

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑
" h+ h6 Q+ v4 V# N9 ~* ?0 v+ _5 {- R  I8 _# h

' y) i( p2 V6 J3 @- D6 V以下内容转载来的 部分亲测 部分未测试4 `" [0 w% Q/ O6 `+ a
. k" J9 t* |- J+ g& W- B
  G# ]2 }3 \2 w, M  X! O

$ j' ~% h- x  r9 S$ C6 r0 YVB调用C DLL时的参数传递/ I" P) q. s" D( ~% u

) d6 F: }/ a  `+ H# T. b函数在C中的原型,参数类型和传递方式 对应关系   6 `" n, ?* @: _/ }2 Q
! ]% ]- O; f# R5 A

# N  A4 _! J" o0 |: q1 M/ s# Y6 Y5 X2 A' y
C DLL 原型         VB声明                 VB调用  W0 @# g6 F" A5 {0 @8 U% g1 ^5 X

# E9 Y& l# C2 v; D) vUSHORT a         ByVal a as long           Call func(…,a,…)
9 N, K! X7 C  r% m0 V" s8 W) o, S9 W' d8 r4 N
int a                   ByVal a as long           Call func(…,a,…)
2 b) q: V! {, b0 b
  {% V3 h" o* mlong a                ByRef a as long          Call func(…,byval a,…)
3 `- a+ S; r/ @5 Q5 x# x9 Z, b7 w& _4 v
int *pa                ByRef pa as long        Call func(…,pa,…)8 b' b; t/ N1 _: [  U

8 U1 Y3 T3 I% w8 C3 W: E7 ^8 Elong *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)
1 g, ^- f7 g9 _4 u+ u% t- s8 ]& Z% p5 O) K7 H) X' w
LPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)7 [5 b$ Q/ q. n- ?% N9 N  O
) Y9 ?# L6 q/ Z
char *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)# s( ^2 N* n$ }& c" {$ x: |
* C7 u/ U/ \1 V  m7 Y3 e' i9 b
wchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)% f5 y" z, z+ g2 p) L# w! j% B7 Z$ r8 E

0 a6 @! U$ P( ]( O$ W7 n! Dstruct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3) 9 Z' l$ F% }" n" ]3 X4 w7 d& Q
3 L3 V3 s5 p6 ~
HANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4) . @7 T7 Y2 ?' z

5 |! b1 R5 n# C7 B2 _备注  
' i% B4 f! d0 p" s. D4 X( J) s: \9 Z& Z- ]  W, C. K6 Y# c9 Z8 }
1)不推荐使用此方式9 L0 E8 ]* K. w/ q! I

% F! `4 f' i* o; A8 |2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50# g; \. P: T: G% p7 b. J

- ?8 B  I8 U( P5 h3)用户定义子类型必须用ByRef方式传递,
5 t4 ^7 K; [# b/ I: S
8 N, v6 y) R% t2 {2 f4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。 0 ~+ i/ a8 t( D7 G$ s& S! J

2 {8 h$ L3 t/ ~/ _; q" _: p! K1 w1 O2 g; K

# ~4 z, Z1 Q! }' H( N5 w( {+ p1 J' N# J& |5 B6 F( q

, n& F9 F: q* f8 O
5 R8 [  H1 a# [2 W- {
% V- |$ f1 j4 t* c5 r数组传递     # Q6 Z+ B- U7 K# o
! ]1 _& G- Z9 i! E* F: y2 A4 |+ m
        数组传递值用ByRef5 h( G: N9 d# _% X+ T
+ s* i) w/ T9 z+ p
        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。( X, N' c0 l1 e% ^
5 S  ~- s* o& W! P# O$ M
! W, ?1 L- Y/ A

& s8 R+ ^, i9 {8 M         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
$ U/ {% W# ?: Z, y/ W" m
, T/ b! c1 v6 i4 P0 [& p2 s, ?: V1 r1 B

, x4 O( c  S" Q' E/ }9 W& Z
( ^# i/ g6 L7 m7 S! _
* I8 T& O5 n8 I$ g5 P: A: {dll函数直接返回字符串
! u3 {7 f+ z7 q% ?4 S% Q
. \8 g8 Y2 |# \# y% m' T$ q/ o
8 c/ ~* X5 y$ U2 o# f) @# w4 ]6 \5 g8 v$ s( Q# n3 B0 V- Y1 S
        VB下的字符串格式和VC中的char有些不同的
7 @/ [4 Q* M5 y4 f; ^( w) ^, D, {) m, b
' p3 F/ _1 \" y/ w        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子: 3 }7 S* @5 J5 E- f5 v0 }# u3 o

) [8 H9 j- q+ s1 W# z: F3 j  c) e' D3 y( q8 H, X5 L) G0 H

7 r' T- m# }( l( s/ H( R     EXTERN_C BSTR WINAPI RetStr()   L+ S( g3 Z' g6 m, ~* e3 j+ a

7 ], E! F. P) T2 X     { $ u* G, l" I8 w
" b" t" |8 t, ?" r( I& ]8 k# Z
             char *str = "1234567890"; * _$ e. p: _- H5 ~9 f5 c

7 p( a) I8 T: U! p             return SysAllocString((BSTR)str);
& w2 G7 l3 ^) J5 h: w! T4 }3 s: B8 v7 e) c' v
      }
& b3 S  Z' R( |, o) B
8 A0 O! I$ ?3 @或者参考一下VB下调用GeTComputerName的方法.
& q/ i5 D* O% b/ u! W2 u
0 n; A9 ]& g* d- b$ T0 o/ T) w9 O- ?' q) ~

0 S9 l; ]( r, u: [' R4 ~. x: R0 `; A1 K

# R  t/ h3 I) Y! \2 _5 @2 |# E0 h  VC++与VB数据类型对应关系
3 \# `1 v' k: w9 V# I6 A& b3 i4 h- j) R) |8 G$ N9 k" z0 v& `/ ^
VC++        VB# o% a0 Q/ ?; @$ B2 h! L$ m
short        Integer2 B1 i) v3 b( ^$ O3 x
int        Long9 @9 M; g: B  ]
long        Long! r, A% o7 J4 [- A8 n- l( q  I& S
UNIT        Long, _; y8 b& E& K; _
ULONG        Long4 k+ K+ s+ i) z/ I% O7 _
WORD        DWORDLong
5 @0 P# E* `7 ^( \WPARAM        LPARAMLong5 @$ l7 y+ j" `: m
WMSG        UMSGLong& n' w8 a( Z- S6 v8 o/ A
HRESULT        Long! n6 l4 ]6 I4 G6 Z" y) [* J3 O
BOOL        Boolean; {( y2 X# U  p( p. k
COLORREF        Long; @$ F6 G" }! r. w+ t" f
HWND,HDC,HBRUSH,HKEY,等等        Long0 B, f" C, w6 o5 b& ~/ \6 K4 y) L
LPSTR        LPCSTRString$ @/ ^& d( J- g+ b8 k# E
LPWSTR,OLECHARBSTR        String% ~& U5 S% ~, k$ v. ^$ G
LPTSTR        String
" r; l# ?8 J/ @/ w+ ?4 CVARIANT_BOOL        Boolean8 D% v: L6 O+ Q- D
unsignedchar        Byte
: o5 m$ z* n/ M: x1 pBYTE        Byte
- c0 A8 y4 H- b; Y4 r. _# hVARIANTVariant
' c* [+ O$ U) Z% E3 l. u0 y+ P(任何以*或**结尾的数据类型)        Long
( L7 B; m; a. Q5 E) ~
) @% t* u6 c- R. j: i# i+ l2 Z$ h3 q( `0 E2 Z
c中的数据类型        VB中的声明        结果" ^7 C, R0 c$ g! T% r; ]
                  
! u& F" x: r( w" S0 O' P' LATOM        ByVal variable As Integer        结果为Integer 类型的表达式
! N6 j6 z1 z) N2 bBOOL        ByVal variable As Boolean        结果为 Long 类型的表达式
, S; n; J7 S2 b) EBYTE        ByVal variable As Byte        结果为 Byte 类型的表达式 $ o& Z2 ?, i8 x* c* L) e  S& ~4 _
CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式 1 B' v( J4 a7 `3 I8 L" e0 P
COLORREF        ByVal variable As Long        结果为 Long 类型的表达式 6 v! K: _; D* M% I& s% W
DWORD        ByVal variable As Long        结果为 Long 类型的表达式 0 [- A% w6 r1 m# ^! K8 g; x
HWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄
8 t  g( K9 O7 w; L7 _# g  mINT, UINT        ByVal variable As Long        结果为 Long 类型的表达式 * U6 {& k, E8 ?' @# \( l
LONG        ByVal variable As Long        结果为 Long 类型的表达式 2 H9 I& J( P' \3 d
LPARAM        ByVal variable As Long        结果为 Long 类型的表达式
; s/ O* P5 s8 g" F. T/ e! cLPDWORD        variable As Long        结果为 Long 类型的表达式
# N! l# Q/ x" I' eLPINT, LPUINT        variable As Long        结果为 Long 类型的表达式
4 Q0 W9 r- g$ T- A. wLPRECT        variable As type        自定义类型的任意变量
6 |/ r; e6 R2 o4 Y7 G+ }LPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式 & U0 A2 L- h7 [- G1 c7 F# Q
LPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)          . X, \+ F* c* Y. z
LPWORD        variable As Integer        结果为Integer 类型的表达式 , d1 u9 X, A: `5 k+ k, v4 J/ L7 `1 r
LRESULT        ByVal variable As Long        结果为 Long 类型的表达式 - z1 e4 h; _  i: \2 Y' b9 B
NULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式
0 E- p+ [2 _- h: x5 ~VOID        Sub procedure        不可用
6 b+ @8 M& M8 O8 S5 F; WWORD        ByVal variable As Integer        结果为Integer 类型的表达式 # ~  X1 m: O- x9 y2 [2 M
WPARAM        ByVal variable As Long; Y+ c3 W3 v) M8 c  |% h7 o
7 T8 I' C1 o7 s: v5 h7 M
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了