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

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

15757753770 楼主

2016-12-11 15:07:57

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑
1 g' E; }/ E0 U. p7 F% D+ T; X' }, C0 [  o5 a( s* v
7 E0 U# V# A! R. F8 G" t* ^
以下内容转载来的 部分亲测 部分未测试
( J/ c/ }4 f' I# I. P) f1 a
& c6 X( ]7 V. H8 U$ h
) M5 w3 |+ u* y& V4 z  D9 f8 i; @% s0 K( \( v% F
VB调用C DLL时的参数传递1 V$ P! y8 a% R% y& ^% u+ f
. d- x* _6 H6 A, c
函数在C中的原型,参数类型和传递方式 对应关系   + _, `# s: G8 C, e# p
9 R% _) H% d7 }3 Q* ^

2 V& B% k) M# `! S" J+ e& o" U2 @. j2 P; l% g
C DLL 原型         VB声明                 VB调用
3 Q; U1 s. i3 C5 Y5 _% U  a. H8 c. r# P6 k  t5 a: [7 F7 g
USHORT a         ByVal a as long           Call func(…,a,…)
7 x. X% a! |( b5 {% s* w6 y3 z+ K# v; b/ b
int a                   ByVal a as long           Call func(…,a,…)
5 }3 r! o4 S2 ]
. c* {1 ]3 O9 ~4 Y# nlong a                ByRef a as long          Call func(…,byval a,…)) @3 n) n# i2 j$ ]9 D9 w

0 n1 z# F- X  t- Tint *pa                ByRef pa as long        Call func(…,pa,…)/ l! D9 C0 z8 P$ w: c, D3 u5 o3 m8 H% m

& i; G3 N$ e: C' Dlong *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)1 e! _6 b+ I1 f% Y

; }; E2 ]0 [* o. Q4 w4 ULPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)
' u5 \  _. p5 k/ J, j
6 h+ D) O2 T: k; [# K( K/ |2 ]% ~% dchar *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)
- Y$ h* [# {" i  {# L9 O; A. u
3 ^$ P; E$ n9 [( [: D$ {# F' i7 P- L* awchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)
3 Y2 t; L1 a0 s
' o  L' X$ C4 J8 C4 pstruct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3) $ ?& F% A. a8 O6 o9 I9 e( T% @

5 Q9 B9 z6 f6 @. C3 t$ M2 b7 ]HANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4) 4 E. I4 }" S$ r
! b0 C, s' f% e* ~& O
备注  , H! l& m  Z' K* d7 b# y: O
9 h- D# M4 s  `$ h, X! T3 [
1)不推荐使用此方式# {+ m* P7 z/ h/ {; c8 T

; V- p, @/ ^, Z2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50& V9 b: E# ?4 a) B4 L% q
+ G$ n- b# `2 ?5 R2 d6 ?! H
3)用户定义子类型必须用ByRef方式传递,
0 G7 D/ t5 X' p0 U1 g/ Q( v5 i. S: D0 m
4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。 1 Y- t" d# j+ p7 p# r

8 M& q, }& n, ^$ v) p6 n8 s' {0 b. b" H

/ k& W: ]) d5 G4 v3 ?
2 ]# R! f: ]9 H) t1 ^
" K1 L- b9 f$ }2 X0 w2 d. {5 O  e* `4 K8 L5 R" H- [
) K/ F# C# Y1 P6 K4 {
数组传递     
4 Y$ O  S! D8 k5 d6 z) Q4 [* O% j7 |; {! m0 L! S% `- G  E" Y& P
        数组传递值用ByRef  Q, {1 I8 v. {% O2 f

4 d9 @) H# B" ~7 z        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。
) s; _7 ^  A# p) H: G7 h$ C3 w- k8 A) Y( ^

! g6 P' B3 w, G6 I* y+ H: v7 S) f
6 [* g/ r1 F  b; }8 G/ e$ \- Y: i2 N$ c         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。8 P! ~- y, x; {+ x6 d* t

) J. C% |: R* U7 H& e9 a) k( u! b& K4 d

) W3 {8 D. x! I
8 a5 F2 g* b- W- {  |+ W7 K" c+ l
dll函数直接返回字符串
2 V; F1 Q: W; q; Z1 W- w5 a
7 H, a! w& t8 b* E+ V, j' e5 `& a1 @" A4 z) P# ?
: _/ V! x! T" i2 M0 E/ I( ^+ w
        VB下的字符串格式和VC中的char有些不同的6 E: q! \% ?8 s' k
$ b& m* o% d- O7 _0 r
        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子: # x, ~4 G0 E! n: X. c

% C1 t$ D4 j* K3 F& r
+ W, _* H0 V( |; c+ R4 u( i! p
+ E8 E1 v4 H/ u: S$ ?; r. X- _     EXTERN_C BSTR WINAPI RetStr() 4 [, a8 N; N- `3 C

, R$ C% x; ~6 O' X6 Y- Z# e     { # Q& M; k# @. |( {

+ d% E, |' I+ Y9 P4 N8 S             char *str = "1234567890";
" o- |7 j3 v0 E6 }  ~# H0 J2 `/ A5 o' x) G7 S' V" o8 z
             return SysAllocString((BSTR)str);
- p9 ]; C1 g: C0 I
  Z0 H, a6 L6 g" P# K* p      }
8 |: d" n9 T: v* |4 b$ ?+ e
2 `! d/ B) b1 x. A) Z! D( ?% F或者参考一下VB下调用GeTComputerName的方法.$ \) L0 H2 U- a* i6 @% y

% C$ Y# O  j5 ^0 T* @" Y; [  E6 N# k- N; J% n* F: W0 i& ^

9 Z7 m' ?# E) w# G" b+ O) Y9 S+ D9 S0 G

6 N" l1 d" p( x" q. l/ Y  VC++与VB数据类型对应关系8 s" x: `" N) K1 S* q& }& l7 {1 y
" [6 |) l/ a1 K
VC++        VB
1 Y' P9 k4 c0 I. fshort        Integer; G! Z+ j; h! d% V
int        Long
+ ]' y0 r& U9 o) ]* Clong        Long2 U7 \4 L( ^& `$ p  L  E
UNIT        Long
" }' N, q/ F$ K5 \. c* kULONG        Long# \2 p( B7 g; k% [" k7 U( l# w
WORD        DWORDLong2 t: l5 w/ C7 v5 |/ f; ?7 P
WPARAM        LPARAMLong$ h* u! J% J7 e9 \& a4 o
WMSG        UMSGLong
8 k3 N; p8 e; z9 ^8 J0 }- ]HRESULT        Long
: l2 \9 D+ n" h, I* j0 u3 kBOOL        Boolean- m) ]# @- y0 k! R3 Q5 _; l9 p" S! Y
COLORREF        Long
3 k1 g& A) L+ p4 s, OHWND,HDC,HBRUSH,HKEY,等等        Long' E& N2 I1 B1 C1 E8 |
LPSTR        LPCSTRString8 \8 F) I7 V3 X
LPWSTR,OLECHARBSTR        String
' P& P, R1 Q1 K3 MLPTSTR        String
' h, A' r( c+ W8 QVARIANT_BOOL        Boolean
$ q! g* K* e# g4 |: i2 runsignedchar        Byte9 R/ V4 \, N5 ?& V+ d; a, \1 \
BYTE        Byte( U" ^4 E9 g1 K! X2 t& w  F
VARIANTVariant) z, v+ g9 I) K" b- W
(任何以*或**结尾的数据类型)        Long
% z. H- I9 E+ M  M0 A
6 m) O: C3 w" V5 _5 @1 R) |3 A5 z
c中的数据类型        VB中的声明        结果/ A! n; J2 i. e# T- N) P
                  
6 m! a3 U% i0 o: k2 \ATOM        ByVal variable As Integer        结果为Integer 类型的表达式
# y2 J1 {, b" L% k9 N9 o1 fBOOL        ByVal variable As Boolean        结果为 Long 类型的表达式 1 y' J% M8 n4 b5 A5 O  d( a) B
BYTE        ByVal variable As Byte        结果为 Byte 类型的表达式
9 U% C0 ~4 n" M5 sCHAR        ByVal variable As Byte        结果为 Byte 类型的表达式 $ C' J. Z  ]( p1 Z
COLORREF        ByVal variable As Long        结果为 Long 类型的表达式
9 F: K5 @1 p& P4 Q1 ODWORD        ByVal variable As Long        结果为 Long 类型的表达式 9 I& J2 A! l2 W
HWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄 . a9 I1 j+ `+ u* w2 q0 u6 J# b
INT, UINT        ByVal variable As Long        结果为 Long 类型的表达式 & t, \  O: I+ |7 _) j& }
LONG        ByVal variable As Long        结果为 Long 类型的表达式 + g7 }' z5 h5 e! V9 E
LPARAM        ByVal variable As Long        结果为 Long 类型的表达式
1 }2 ]7 ]1 w, J# OLPDWORD        variable As Long        结果为 Long 类型的表达式
! t$ v. B( T/ F! t; X2 NLPINT, LPUINT        variable As Long        结果为 Long 类型的表达式
1 r5 f+ I6 O; c" R; r& C/ K2 JLPRECT        variable As type        自定义类型的任意变量 2 n% Z5 u9 A) w1 q7 T3 T0 {
LPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式
9 `4 y! ]0 h4 uLPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)         
6 k3 L  E0 N; H  b3 E- sLPWORD        variable As Integer        结果为Integer 类型的表达式
( X8 U% I& C' M% }LRESULT        ByVal variable As Long        结果为 Long 类型的表达式 8 k( L0 ?+ u4 \4 f3 z) B
NULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式
4 x/ c' Q$ @% C( r8 qVOID        Sub procedure        不可用
" z) h, P% s& C, @9 T) aWORD        ByVal variable As Integer        结果为Integer 类型的表达式
& y7 ~9 e1 U% A1 H& V* D, \WPARAM        ByVal variable As Long& A4 U: T2 |' _$ ?' Q

: e& e- J1 H  |& w/ h3 s
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了