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

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

15757753770 楼主

2016-12-11 15:07:57

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑
# d1 D% J: T- V4 |$ F& |3 L) Z' f5 G$ H6 T

5 `. X+ s) Y7 Z4 r以下内容转载来的 部分亲测 部分未测试
" `: d* U5 ~! k0 |- E$ P% h( M% e+ m# \/ w
; m0 q% t9 U( p4 P+ }
+ E% k' n- T. }2 M" T
VB调用C DLL时的参数传递, `0 C6 B, f3 Y8 A0 z

& D( Z3 I$ B* n& P3 v$ E函数在C中的原型,参数类型和传递方式 对应关系   
  }/ ~9 J/ G" w4 n0 C2 h) B! a

0 k' }) d( |& W/ W
) f" h6 Z7 c) I# J( k: C7 jC DLL 原型         VB声明                 VB调用" c7 R5 |' H3 \& B+ w% u$ U% [
: |) u, }4 S1 \6 d& \% V7 P
USHORT a         ByVal a as long           Call func(…,a,…)0 r2 v5 Q0 E" |9 I; L% O

( S) O. x8 R; e2 ^int a                   ByVal a as long           Call func(…,a,…)0 j9 T/ ?6 W5 v

+ ^) Z% \: G! s6 \long a                ByRef a as long          Call func(…,byval a,…): `3 i- D% ]4 ~/ `6 J
1 T& x# z! A( K
int *pa                ByRef pa as long        Call func(…,pa,…)/ M7 Q- q' `6 B7 Z$ g9 }

; J4 R) \' r. X! llong *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)
# f- d# v1 m4 j( q, i+ n  S' N. S# o$ @6 N' S) ]  U/ A
LPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)& {1 {/ K3 K1 n3 ]5 J# v7 h( U0 K

$ b. c+ ]6 f3 F5 Bchar *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)
- g# ~' d- P7 K; w$ ?% b  C* K  M7 y( m" Q" y
wchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)
6 I4 K  g2 u" a9 l
7 p; T" l3 h& p$ \% m. astruct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3) / f4 _/ a' O! Q) _! x, M

1 o5 \4 e4 r+ u/ h/ J) G; e+ zHANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4)
  ~9 ^: g) J4 u8 |
  {  g( @1 H; ?备注  
/ X  g7 z) L$ Z% ?5 a$ V8 T1 _1 [+ B: h0 H* a! H2 ~
1)不推荐使用此方式
; V) b+ r4 b% m/ f! Y
7 O; ?7 T8 w# {3 p( T  f2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50  B5 ^6 Z( t+ M$ K/ D

9 n. E; e4 O) d6 i8 J3)用户定义子类型必须用ByRef方式传递,
. i$ l/ U1 {* U; f& H$ z; o
( X5 K& P0 |  w1 O, V; p% Q7 i4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。
( n! R& c3 Y* v
! x! G" P2 d8 ]1 a; B% w9 N8 |* `( T* c( H; T% l
: s4 c8 L! h- A* Q1 [; ?9 |% ]

3 T" T( Y/ q9 I* o, v; m! I. K+ ^( ^- K& A& A

* S2 Z0 k7 H# u# D4 V% X& q( j  U" z' f& d2 y0 B; v
数组传递     
' x+ ?) |* P' z) m6 g' u( F
) [5 ]1 V- i8 d9 l4 z. Y+ A        数组传递值用ByRef% t/ z7 M$ q3 F6 V) n
# m+ C1 {7 [2 Q3 C* S
        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。7 x2 ?0 N; l8 \" K! Z; x; W" r7 }
* j5 U. C* Q+ ?' G8 U8 G
3 ]  O* ~# @7 Y5 P& s
4 ^$ @% w3 K2 ]/ t
         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。) K8 E; Y* }( w! W2 t; ~
' r7 p2 S) l5 @6 U# \, q

: O* ]- i- ]- d8 Y6 l1 \! S6 e# U' p, @. J+ _" k5 N3 e
" X3 k" i6 i' `( ?
6 Y  Q4 X& `8 {# W% Q
dll函数直接返回字符串
1 i3 V0 Z& u, b, P/ R$ S9 y  \. Z6 }. Y- |

& |$ O' [) A- ?, [9 Q/ I5 l, h6 D
/ L. V( _4 a) I7 f/ e! i        VB下的字符串格式和VC中的char有些不同的
( t; O; S: q" a* `
- y6 V% F4 U& t7 e' W3 M        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子:
6 S7 Y' E' b- h9 R0 M) f, a* ]3 `

/ S$ D! y7 ?' o, _3 I" m
" r( I  }+ C8 V" q  ~9 W     EXTERN_C BSTR WINAPI RetStr() 6 `- g4 J& ]' E( z  X9 t/ F5 H

# g/ }* `/ R' d, }' V! Q     { 9 v9 j4 Y% @) V6 Q
5 t9 s0 D; F/ \) a8 k
             char *str = "1234567890";
9 w- c0 I- L0 N6 H  s
% w3 y1 K" A. c/ v) n5 J             return SysAllocString((BSTR)str);) k" b. h& A5 D: @$ m% c7 Y
7 ^% y/ n% |( m8 y: h
      }
- D+ q+ _2 t* w2 {" ^% J% B* m" N
' ?! e) |3 ?8 d8 ~3 _% d. K或者参考一下VB下调用GeTComputerName的方法.4 \2 A6 W9 m' L6 R& \; w2 s. B+ k

7 G; n) {/ m% E" G3 y% v% }* r- q* T* W  g* ~
+ a2 l0 @0 I& V" R1 `

' H* ^4 G8 u. h- v" i5 N2 v: S$ L" Z1 Y7 I" b4 T
  VC++与VB数据类型对应关系! Y' M4 c- F0 W  v6 E1 T

" z- n' D- A+ U( b/ J' {VC++        VB
; ]* G6 \2 [1 f5 ~8 S; c7 R9 ^short        Integer, D0 e0 [3 _  A, |
int        Long
- ?& a  r  ^" W7 Clong        Long8 Y6 {# A5 U% t+ V$ g
UNIT        Long
$ S) K' @# z2 ^+ p& f) dULONG        Long! X+ G% \% N% {2 U3 b
WORD        DWORDLong
# T% r( d$ s% x6 rWPARAM        LPARAMLong
: r3 ~% v3 V2 h' iWMSG        UMSGLong
* l- G  Y/ E# @. ~HRESULT        Long9 [8 ]6 Z: F$ F2 s& I8 h
BOOL        Boolean+ W  k" w- q# {
COLORREF        Long$ D& c: _6 A  x6 A, X1 Y- c
HWND,HDC,HBRUSH,HKEY,等等        Long4 f6 g6 T1 m# F- y" x% A- w
LPSTR        LPCSTRString
& b* F6 ?# t; z6 [$ MLPWSTR,OLECHARBSTR        String
7 k0 ]/ z  V! f( |7 CLPTSTR        String" o8 x( _' E: e4 ^7 f7 T
VARIANT_BOOL        Boolean
" g( k; u# B( P' ~# P; l  uunsignedchar        Byte5 D* Z) l* e" m! ?# }7 n
BYTE        Byte
3 L# o: i0 p( Q, M& D( N5 F. lVARIANTVariant
2 c( u# ?& e% K$ n: N6 G, q(任何以*或**结尾的数据类型)        Long8 P/ a7 C# w1 r9 ~7 i( t) Y5 W8 I1 l
8 S$ m- t. L# C: ~: _

  D. [/ F# Z& E; R* hc中的数据类型        VB中的声明        结果! s! F- x7 Y6 K3 Q8 j. `
                  
* {+ _  d. U6 PATOM        ByVal variable As Integer        结果为Integer 类型的表达式 . K- ^( k  w9 s; M
BOOL        ByVal variable As Boolean        结果为 Long 类型的表达式 : c: c, R$ _4 n% R, h! q) D! q
BYTE        ByVal variable As Byte        结果为 Byte 类型的表达式 9 X' x6 l$ V6 B! P' H
CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式
" n& ]0 f4 ?7 D! \! ~  {COLORREF        ByVal variable As Long        结果为 Long 类型的表达式 6 F- S8 `& m* y* X. l3 {2 O
DWORD        ByVal variable As Long        结果为 Long 类型的表达式 % ~3 U/ b8 ?8 p" B8 @
HWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄 + Y5 m* c0 F& x0 [
INT, UINT        ByVal variable As Long        结果为 Long 类型的表达式 & x0 H6 ^$ \$ f/ w% k8 J2 }
LONG        ByVal variable As Long        结果为 Long 类型的表达式
3 ]+ G2 k% A% N* b9 KLPARAM        ByVal variable As Long        结果为 Long 类型的表达式 ) E5 v! S4 {" X9 F* D
LPDWORD        variable As Long        结果为 Long 类型的表达式
* O6 R1 a# I, T' q- [2 vLPINT, LPUINT        variable As Long        结果为 Long 类型的表达式
8 `8 `0 Z  p% P: q: X0 \$ D9 n! QLPRECT        variable As type        自定义类型的任意变量
9 i. c  X& t+ p; Y( ELPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式 - [! m, ~9 Z) _  @+ z
LPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)         
4 N" t& r: K, w& BLPWORD        variable As Integer        结果为Integer 类型的表达式
( i" e( ?* W$ f8 U7 [. q3 ~5 WLRESULT        ByVal variable As Long        结果为 Long 类型的表达式
! g9 w( r: Y7 q9 I9 f% mNULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式
% N! f2 G+ f  F9 c5 v- q* V( @; ~; l& HVOID        Sub procedure        不可用
( |) M! X6 Z6 s) X( N$ D: m9 Y0 YWORD        ByVal variable As Integer        结果为Integer 类型的表达式 5 p7 ]  T% L5 ?5 z2 X" d" R0 y9 K) j
WPARAM        ByVal variable As Long
9 h8 J6 q/ R2 C( l. B; B3 N( y; ^) |# x/ h- n8 m9 F) B
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了