PLM之家精品课程培训

PLM之家精品课程培训

联系电话:18301858168   |   QQ咨询:939801026
NX二次开发培训

NX二次开发培训

UFUN/NXOpen C++和实战案例

适合初级入门或想深入了解二次开发的工程师,本培训结合ufun,NXOpen C++,大量的实例及官方内部的开发技术。
公众号二维码

关注公众号

点击扫描二维码免费在线高清教程

课程详情
Catia二次开发培训

Catia二次开发培训

市场需求大,掌握核心技术前景广阔

Catia二次开发的市场需求大,人才稀缺。掌握开发技能潜力巨大,随着经验积累将在汽车、航空等领域有所作为。
B站二维码

在线原创B站视频

点击关注工业软件传道士主页

课程详情
Teamcenter培训

Teamcenter培训

全方位培训,从基础应用到高级开发全覆盖

涵盖用户应用基础培训、管理员基础培训、管理员高级培训及二次开发培训等全方位内容,由多年经验讲师打造。
QQ群二维码

加入同行交流

点击扫描二维码加入QQ群

课程详情
×

PLM之家plmhome公众号

课程涵盖: PLM之家所有原创视频

×

关注B站视频

所有高清视频一览无余,全部在线播放学习

×

加入PLM之家QQ群

同行交流,疑问解答,更多互助

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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:07:57

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑 $ }) i5 ], @" h4 n

" s; q/ s6 k/ \$ X2 u' i2 B4 Y  s4 Y% [: S
以下内容转载来的 部分亲测 部分未测试
6 D6 f8 a- B7 M2 j
( Q$ m7 [9 {2 A* }5 [& K- d' f+ @& k7 O. X
8 z5 B) n) P8 \; C) L0 b
VB调用C DLL时的参数传递
$ G4 X* y! H( b) k% B) Q  X; Y4 c5 N8 i4 ]0 J0 [) g, l$ G) W6 f
函数在C中的原型,参数类型和传递方式 对应关系   9 b  _9 o, D. e9 y# W
% e3 Z9 n2 l! U5 u) n1 p

+ [' V  b; n  ^
, d$ H2 D, I  U( ^6 B- hC DLL 原型         VB声明                 VB调用
/ H- V8 h, ^+ A. \& J% o& |! Z, I" g. d! I# R8 @( b
USHORT a         ByVal a as long           Call func(…,a,…)
! s- [9 l) w" m! m1 a6 L! @
0 K7 ?) Q# {  wint a                   ByVal a as long           Call func(…,a,…)
; x) Z+ ?# m* P0 N
! D( G  v& @2 p' z' u' `. dlong a                ByRef a as long          Call func(…,byval a,…)2 g9 v  |, Q, {; y' _

" u5 F+ n4 K( i: n7 e, Z( Zint *pa                ByRef pa as long        Call func(…,pa,…)% d/ |: g5 q+ {5 I# W0 S

8 A" ~* G6 ?& _$ p3 j4 Jlong *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)" O& R# G4 T% L& K9 @

& o( B4 C5 L0 [& B3 mLPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)9 c3 E9 T' y' Q5 q2 U

& f# M3 K( _+ N9 J4 Gchar *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)
; P) Y& Q3 l& n
9 y! J. H# Z9 x5 V& Awchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)6 C0 d4 K7 X7 }. [, p" M- P7 f

4 p3 m: Y; n  r, ?0 C+ e' bstruct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3)
% f( l, {9 }% N* r+ n' V3 \/ d5 W% F
HANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4)
, |+ n# e7 z2 E& C# P& ^4 l3 f8 [) b  w! j9 u
备注  : t9 K' h# q3 V' f5 w

8 X, Z% u& \3 T( W1)不推荐使用此方式
* y! @, ?1 h8 {3 M7 M% g5 W  K9 S# ~. S+ P/ Q- d! s8 x
2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50
3 y0 u  ^' l- V2 A: ]% D3 f7 s. r' H1 ^$ C- v& H
3)用户定义子类型必须用ByRef方式传递, / @0 s8 c6 B% V& h
- B) c+ ]* z+ s3 M; R+ O/ C1 U7 \
4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。
# i  S- d$ D; P4 \6 C$ S) ^" l7 |! G& v
5 L* {6 O2 o* c/ I4 [' l
8 \' w# I% p- i8 N- w4 A1 d0 J( N8 {0 Q

9 d5 w; A9 P( L8 E, z( j" ]; s- Q1 H- p7 g) h% _

9 Y% z# I$ _9 V# k7 O2 ~
) ]. a. P' j2 T6 {4 ^数组传递     5 ^( e# d2 @7 _6 g  r

2 H9 e) k0 U- S# f, U, T        数组传递值用ByRef+ m& ?: O$ e& |/ N- j+ J4 s& A$ t
+ Y% b  K; S  E4 t+ j4 a4 Z8 N- w
        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。0 C2 K$ E1 x% l/ D
( B9 a  j2 V4 R! K0 i" M; g4 m
" h( d, i6 ~7 O! Q
: ^; `' Y9 [# h+ M- X  c& f
         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。# X; H6 f3 j4 ?" L: u0 I7 V
1 z& ^" H5 ^/ g( m- A$ D" T" [

1 O7 e+ f1 L" _9 z) o' e& F# ^4 s0 n
( }( G" v9 u. R1 v
& Y8 E2 h1 ?8 ~7 D
dll函数直接返回字符串
5 ^$ K9 y0 T7 h* |
' q$ S+ `" c7 U8 W" Q
" I. U" p- K5 y
& P( a2 D  i/ b9 ?! G& l6 w4 {        VB下的字符串格式和VC中的char有些不同的, C5 c. y4 Y. |( }) E0 e" t# `8 d
7 e5 b) ]# O: S9 ~/ s
        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子:
4 ^! P; q/ n3 P' M
2 u4 P6 f" U) X: y) O! @
/ @& F  g) E% U; T/ a. x! t8 x% ]! o* i" t8 z) F6 \8 c
     EXTERN_C BSTR WINAPI RetStr()
. f4 L5 r5 n2 z' |
/ q/ e) G. [/ q. p/ J     { 3 E. b/ o1 C  m3 p+ N; P
8 F5 L3 g1 g  i. L8 x
             char *str = "1234567890";
0 }" r) C% j# U: Q
6 J7 @7 v: f3 T/ w             return SysAllocString((BSTR)str);% K) o2 O0 Y) S) P5 |

$ K5 V/ K2 _6 P. _6 |      } 5 S1 E" T2 K; K/ n1 r, w

" _- J! u( L0 X9 B+ W* [, S2 K( h或者参考一下VB下调用GeTComputerName的方法.. r9 c5 V& m' h. j: u9 c

" m- ]+ ]  Z& P; v) [  w+ T9 p! H1 l: R+ Q. }, n6 ~

1 w9 N- H+ g  ]7 I7 U7 m0 a' F+ {& j3 x2 m( T# \1 \3 D
( ?1 e' n3 _- L* p" k& w9 I  F
  VC++与VB数据类型对应关系
. l5 E: x7 ?$ W! i, k( B: P/ F6 u0 x9 g+ `# l( w+ t
VC++        VB0 J# ]: Q6 k; Y
short        Integer2 t4 ?2 ~7 Q. t) C# {' n
int        Long
+ }2 p# [2 `. M% D+ }long        Long
" o6 k$ [2 |9 O& x2 I+ w9 RUNIT        Long
* E. h1 L/ ^4 n/ _" ~$ \+ a$ TULONG        Long
: u2 ^! V2 B# J, c! tWORD        DWORDLong2 A7 u/ k; \7 n; O
WPARAM        LPARAMLong$ f5 V( ]! g) o, q
WMSG        UMSGLong
* y& U& p6 }) sHRESULT        Long* I, R2 H: F1 X% @+ O8 b+ I
BOOL        Boolean
7 p# H4 l0 k0 g; \, qCOLORREF        Long1 k4 t! I0 w- z$ y- A2 f. V* M' |$ d
HWND,HDC,HBRUSH,HKEY,等等        Long
  [1 c+ }! n' dLPSTR        LPCSTRString, Y& B7 B0 ~( q0 v7 }4 Q
LPWSTR,OLECHARBSTR        String
+ P4 V4 k% R! s% c' ?LPTSTR        String/ V( s) @0 Z, }0 M; x9 n5 D' w
VARIANT_BOOL        Boolean' I/ p! H. e2 I# P/ j; G5 o
unsignedchar        Byte+ q: e# O& ~8 H: r# ?
BYTE        Byte
/ r6 O/ l6 d3 l# R9 w) OVARIANTVariant
, Y- d2 k+ H6 i) R' @! ^# z7 n(任何以*或**结尾的数据类型)        Long# g( K8 V; |; ^( U: q6 V: A4 ]  B7 u

, y9 z8 ^, F9 V: M! ]6 t5 E) k3 N. e% I% b' E$ k7 \
c中的数据类型        VB中的声明        结果9 Q1 p: T2 [. K7 U4 K3 G" M3 |6 t! H
                   ' O3 M# V2 j9 N. o5 N+ s
ATOM        ByVal variable As Integer        结果为Integer 类型的表达式
: Z; c; x7 n  J2 b1 r2 \BOOL        ByVal variable As Boolean        结果为 Long 类型的表达式
' V9 z0 n+ [! z  RBYTE        ByVal variable As Byte        结果为 Byte 类型的表达式 " Q% M9 N0 w0 Y% x0 E
CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式
; g. ^( \4 M7 ~! GCOLORREF        ByVal variable As Long        结果为 Long 类型的表达式 ( m' p9 g9 G4 D7 H& J/ i
DWORD        ByVal variable As Long        结果为 Long 类型的表达式
$ t+ }% s( _& t4 rHWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄
. u3 ?+ W! [9 Z* ^* e, ?INT, UINT        ByVal variable As Long        结果为 Long 类型的表达式
7 j6 l# Z, b7 E( v  K1 W) rLONG        ByVal variable As Long        结果为 Long 类型的表达式
8 p$ y( I" [4 g4 G. q! ?/ w7 JLPARAM        ByVal variable As Long        结果为 Long 类型的表达式
) M8 h) `, z' ~8 kLPDWORD        variable As Long        结果为 Long 类型的表达式
! p- w' N6 i9 G0 pLPINT, LPUINT        variable As Long        结果为 Long 类型的表达式
! ]$ L0 T8 H1 |; @LPRECT        variable As type        自定义类型的任意变量 , e, [8 F$ b. x: J& ~+ f. [9 L
LPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式 ) s0 }8 {  J$ Z  T4 C' M
LPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)         
# w2 S- n- a- hLPWORD        variable As Integer        结果为Integer 类型的表达式 5 J3 U! [7 [% K0 B% @: C
LRESULT        ByVal variable As Long        结果为 Long 类型的表达式 ) w7 |8 u  |+ v
NULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式
, D1 C3 {# g6 ?1 AVOID        Sub procedure        不可用
0 P2 b5 T& i8 o9 l5 g) iWORD        ByVal variable As Integer        结果为Integer 类型的表达式
7 p2 b/ j- }' X' w# j# kWPARAM        ByVal variable As Long6 ^( J- j3 C- W/ S' p" z4 C' A
' y+ O5 p6 y9 B4 N: H9 ^
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了