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

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

15757753770 楼主

2016-12-11 15:07:57

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑
! e( \7 _  W8 j1 v0 U2 w9 Z1 |- G; b8 K' s: A5 O$ g; G+ U0 I
, }6 c8 s6 V0 b6 Y0 r- D! z' R: Y0 U
以下内容转载来的 部分亲测 部分未测试0 O3 }7 G+ D: I- Y% |; i

' t4 m0 X0 N" _
, h) x1 A8 P' s, z, e, U  k* z/ I) O3 e; n' T; ~
VB调用C DLL时的参数传递* A! v- _% V- F6 n* t5 C8 t6 }

3 l- {  K! D9 o3 m. U5 e" r函数在C中的原型,参数类型和传递方式 对应关系   4 S2 j+ K  C& I; _+ |- ^; K& V  T

- C$ S% x, X7 I4 _/ }* H. `$ U8 d+ I7 G, r# L' A
8 ^$ d6 l, M3 m5 J. A
C DLL 原型         VB声明                 VB调用1 w. U2 p3 B: }
5 r5 G, L- P$ D
USHORT a         ByVal a as long           Call func(…,a,…)
# G) @. _5 T- a3 P( ?3 M" C4 |* o* b
int a                   ByVal a as long           Call func(…,a,…)
* n& B7 M6 w# t0 Z& @5 s
: V1 ~# Q% @$ F3 _/ d7 Jlong a                ByRef a as long          Call func(…,byval a,…)
9 Q3 i  U; Z4 f( T) C4 U. [" q
6 b( j, X. h" Z* X7 fint *pa                ByRef pa as long        Call func(…,pa,…)
; y1 c. h$ E7 P4 O( K* i2 }5 d) a7 i  Y& l  U
long *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)  O6 @9 _/ G+ U2 A2 M# M
2 f3 H5 p5 V* A* C0 R
LPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)
2 m" a2 A  @3 c0 P4 o3 f& {  n
% N  K8 Z% d- x7 fchar *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)) b3 R$ z7 E1 B+ U$ ^

; z+ L, p4 \7 j+ O9 z$ [  nwchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)5 X+ C" E1 M# w& K" r

1 `+ z. m! g. Z# ^struct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3) . V$ R7 x% }! X* o
, _0 t9 Y. z) l- N8 o: T! _* s
HANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4) % G7 t8 r3 D8 B
- X7 k9 ?3 V: w% Z
备注  
" ]9 p' z4 N. |" v: r/ R
( v1 a2 T3 x7 C$ I0 S3 e3 u1)不推荐使用此方式
9 ~" U  S) A, b# j/ J/ h, A( e8 V0 k. j2 w* j
2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50
7 M0 l  z* P. f! O8 V: P8 l# ~2 ?2 ^. ]$ q+ x6 p/ R/ r: l- S3 l
3)用户定义子类型必须用ByRef方式传递,
2 @0 A. k, n) r! a" `% M$ k+ S; v
6 m% R! y4 b% n$ D6 X' d  O4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。
! k2 z) k& ^; [5 z- A( H1 [4 ^% [8 U
( y2 t  t/ B4 Y& N, o% ]  O
$ j+ t& }, m* t8 g+ v% O3 T$ S7 d5 }9 K
7 b0 X* t" m7 P! I9 a

) y8 U% B$ y2 f+ y1 B- h  D2 @" q5 M4 e0 F& ~7 G  |
! |6 V8 k( |/ M
数组传递     % V% q1 q7 O% }9 T+ e0 s1 O
" O+ J' o- _6 Z
        数组传递值用ByRef
7 _. |# P: [, K  L
# C& p# @6 Q9 c% ~) D        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。
2 t+ Z+ L" g+ h1 r) ]4 g8 t4 D) K0 d: N- J
4 \2 q- z2 ~4 u# q# m  f

. L: U; i+ d0 |- V0 y: V: _6 c( c         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
* W5 p9 o6 i7 l  z; k. |3 T4 \& t9 O( t; f

! k& E9 X1 O) S2 b
9 G' L; C) S! i/ Y; F9 H+ v9 H  o& Z
7 m8 T6 g: z2 v5 z+ S
dll函数直接返回字符串  A$ F/ @9 P1 _" G7 N, v# c4 w  A

9 H9 b6 P  H5 X/ L- r1 ]
6 S- u0 q1 o5 C' c$ c
! ]$ v4 j. \: D! T4 _        VB下的字符串格式和VC中的char有些不同的/ D. k7 q' V' y* h% y1 v# R

- `! ~8 x6 ?8 l1 ]0 Y# I  V        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子: , `, x6 ~/ [3 h& m2 L
* y' K1 E: i* N' h8 m
: R$ Y( p! z9 r' Q
; ^$ @9 f( D/ _( g
     EXTERN_C BSTR WINAPI RetStr() $ W" l) }# l9 d' j
# H4 n; t0 _1 q$ O
     { ! y6 G7 O+ [- P* z, H
! b2 o2 _, d3 W) Y1 T
             char *str = "1234567890"; 5 z  M; n6 D# u* d
# [# j, Y& ?! {
             return SysAllocString((BSTR)str);
& l: {9 ]; g: d6 s9 Q; i0 f8 S& }
      }
& I( Z2 Y2 s, }9 n/ D4 P* r: x! J- I, q; ^! [& C% {! W5 ]# R6 ]& |5 Z6 k
或者参考一下VB下调用GeTComputerName的方法.7 x/ m. }" S/ M/ n% s8 e

: |3 U. V2 U' u( O3 V5 _' K5 U) R8 M4 D1 g# Y3 I
9 w- c$ F1 P6 U, C0 F3 A
9 r! A  r$ u5 a' M- o
  V9 i, Z6 m$ [, t$ K" j8 o
  VC++与VB数据类型对应关系/ u/ _& {% Y4 b

/ u0 w, o" m" `. [VC++        VB! G5 j; }: A2 C+ z8 c; N
short        Integer
, z; _) r0 o7 h1 s7 n+ {int        Long4 ~4 z7 }0 j6 M/ T" l
long        Long
7 b, `* @7 T) y# k  i8 q, KUNIT        Long
: N" L  O* R% Q% o) MULONG        Long
- y+ R0 P, @* QWORD        DWORDLong
7 b% j7 F+ K# r, A; \& e& HWPARAM        LPARAMLong
3 p9 A4 w5 C$ W; eWMSG        UMSGLong
; g, c: ?  F# y5 f) @HRESULT        Long
0 a$ |7 d  I4 @& o% n& [3 z! }BOOL        Boolean! C( p: v; f6 n
COLORREF        Long
1 Q, C6 q4 y1 z3 V6 O% f5 BHWND,HDC,HBRUSH,HKEY,等等        Long
  p9 @/ Z* {% |) ULPSTR        LPCSTRString
) V9 {& F1 R: ~; z, ?; _: PLPWSTR,OLECHARBSTR        String
1 T- x. b8 a' P  iLPTSTR        String! F9 K8 I; g! q7 V+ |' v+ E
VARIANT_BOOL        Boolean/ z/ L# d# z4 H# @3 U
unsignedchar        Byte+ n+ @: _. `  K& g/ Y2 y8 B4 }% Z3 M
BYTE        Byte
) H4 Y! c6 Q/ b3 j" eVARIANTVariant% L1 N. R1 ~( O0 [3 }% i0 F
(任何以*或**结尾的数据类型)        Long
' r5 h: ^$ M/ c: i, ~
- l5 D, K% C+ z; w/ _9 \+ W* b& y
c中的数据类型        VB中的声明        结果5 g/ Y1 m. y- g/ O! b% [
                   " J" M( V3 o6 `; m8 ]
ATOM        ByVal variable As Integer        结果为Integer 类型的表达式 $ c5 ~% u6 U9 Y$ B, O
BOOL        ByVal variable As Boolean        结果为 Long 类型的表达式 , X" w2 @+ y0 E! Z+ }! Y3 }
BYTE        ByVal variable As Byte        结果为 Byte 类型的表达式 + n  p) F, k3 F2 a& y& L& D6 w
CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式
; Z* n( S& h/ ~5 S1 L5 C$ ZCOLORREF        ByVal variable As Long        结果为 Long 类型的表达式
+ L3 y9 M. b) ^DWORD        ByVal variable As Long        结果为 Long 类型的表达式 ! N8 V7 R8 d7 u& Q- _1 M* o
HWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄
9 t" h$ Q2 v- |- j; i' _INT, UINT        ByVal variable As Long        结果为 Long 类型的表达式 : h# m3 ~' p8 w# L  Z& A. X
LONG        ByVal variable As Long        结果为 Long 类型的表达式 ' _; h4 g2 {' P# i2 p1 z$ }8 c
LPARAM        ByVal variable As Long        结果为 Long 类型的表达式
5 ?' R* u! J$ g" U! aLPDWORD        variable As Long        结果为 Long 类型的表达式   R( ]6 v  q& ~) }
LPINT, LPUINT        variable As Long        结果为 Long 类型的表达式
4 ~/ [( u3 `3 j$ g! \. D4 ]7 KLPRECT        variable As type        自定义类型的任意变量
. ?2 x. D! O* f9 S2 e$ uLPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式 ' s5 ~. T% Z3 C9 T4 _
LPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)          / v1 m( H/ g5 L7 \
LPWORD        variable As Integer        结果为Integer 类型的表达式 ) v* K. D: x# U8 ^+ v0 w% l# j
LRESULT        ByVal variable As Long        结果为 Long 类型的表达式 7 K% V& u4 U; e" h- B
NULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式 7 i1 \" j4 U0 s" d" c7 a; x" @- O: @
VOID        Sub procedure        不可用 & D3 C4 k, d# q- A
WORD        ByVal variable As Integer        结果为Integer 类型的表达式 + i; i# h, E3 `8 e
WPARAM        ByVal variable As Long; u6 _5 a/ P* ^* A

- k* `8 ~! N& m. W7 q# i7 u
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了