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

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

15757753770 楼主

2016-12-11 15:07:57

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑
: B3 H. l4 W! Y( j
) X  u5 ~! I+ V" e5 p% T, S4 u/ w( u3 G6 [
以下内容转载来的 部分亲测 部分未测试, D3 a* I2 f0 ~- M

( u* J5 a/ F3 N1 ~$ i
0 x; e4 X- I1 p. i2 y
% F3 L' h" ?, k' AVB调用C DLL时的参数传递6 k7 u( |& S/ x, o8 Y' o: y

+ p$ l$ P4 f' D& `0 k; n函数在C中的原型,参数类型和传递方式 对应关系   
- H! x8 Q9 ]7 \  @& T3 o9 w% F$ m' J8 P" o+ f- J8 q

; N: {+ S; D! T  I" s! n" C- D# h: ?2 T$ C
C DLL 原型         VB声明                 VB调用
3 V: {# U* J+ z$ q) {5 ?5 V( |- {+ {( ~5 z# g
USHORT a         ByVal a as long           Call func(…,a,…)$ y0 E. P' z9 t& o
. A# Y& r/ s  V* B( o, `
int a                   ByVal a as long           Call func(…,a,…)
/ `: C7 m: J/ ]1 H
$ r) r% `& d2 Q& S# c0 {long a                ByRef a as long          Call func(…,byval a,…)/ o) F4 |' X7 ]1 d$ `$ Y* @
4 b0 \* `  X+ S1 L$ v. F& q( W
int *pa                ByRef pa as long        Call func(…,pa,…)
) h: y* U1 p4 [/ _7 j0 y4 P( e, g0 h  h; K
long *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1). e6 c5 w/ k- C8 p" Q
. X( A' I+ e6 m& H; m( o) m) W
LPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…); _' H9 D: o. G; D/ E5 b' [

9 d) g! {. f& [  q/ ]. Wchar *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)
: s- L6 F; f6 K0 Y- O3 B
$ L5 c6 [) l) \& |wchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)+ @/ `) k5 u& e6 x5 X4 G
! z& u. K, X0 e/ E% ]
struct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3)
; S/ N8 B! \0 X, u8 J- r8 y- C0 F- O, B3 M' v1 ^
HANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4)
: }% G2 h$ h9 N) L- Y- U/ i3 R0 r# _/ x% }( u/ S4 }1 m8 v
备注    E% N: F+ C* G: X' `
# j" j3 }# X$ x6 f
1)不推荐使用此方式0 a$ b) r) b/ n' }% n/ K* t; D3 t

0 ~6 e4 v: a' ~, b1 n2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 507 v7 N: F8 U5 W9 L# Y4 A  s

2 [0 y6 Y7 y% @0 z3)用户定义子类型必须用ByRef方式传递,
- |# }; ^4 U5 Z) O; a7 _
' ~5 I' K+ |; @3 I% i! n- I) p; V) h4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。 1 B% k6 ]3 x( v! L% @) K

* M6 U' x$ I3 T, T- d0 D; n
3 ~$ {" F4 z5 C, \! @6 @/ s
4 v* z$ M3 \% M$ @+ F2 v8 o9 ^+ _* a0 K5 S

% l: R* v7 M% w# t' L# C0 {5 q$ w% k& ]( U% y  r
: T; z) N, `1 E0 r) U3 N: k
数组传递     . n1 [5 ?9 V# ?0 x

6 Z( h4 R$ B  o* T0 ~        数组传递值用ByRef' k6 ?1 ^. V: W0 D) L
9 x' X1 O0 H: W' z$ L# \1 W: a
        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。
# J8 f2 G3 f* A! x- r% ~6 I! ^% x( R) p8 T3 d

; W; J0 }! Z9 [3 s: ?/ k9 m. F2 s
; ]9 I7 D, ~0 f4 t, j. P6 E         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
" `& k; [4 }) b3 p
5 [3 `* O6 P, w6 o3 N
7 Q) J  k8 e$ R! |. p4 I7 `' F! _6 c0 ]7 a6 l0 N

0 B1 i/ k! y: {* E' v
, F( ?  q5 ]' j, L, f$ e; Fdll函数直接返回字符串
/ Q# b5 H( L, A2 e/ s
7 ^9 {# \8 h, y) Z
5 ~# X" E; U, k- P+ M% l" J
; k, R# `" U0 ~8 `  d        VB下的字符串格式和VC中的char有些不同的
* M7 B5 d* h" r% p+ F1 J! R( E5 r$ G, u+ G
        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子:
% O, o) \- K0 b% q% i- X% ~9 }
# p: P, W7 U. y4 |3 X- X& W" C$ n% h5 p9 a

5 D3 U( H5 \/ R" V( O9 h0 `; w     EXTERN_C BSTR WINAPI RetStr() ! W# S' z8 |2 S8 G

; @' N) s$ M% j     {
2 J' Z2 s5 q4 @9 G0 W: x0 K
6 G( Q( |3 h. T/ Q. p2 {+ c             char *str = "1234567890"; . F. @0 ?5 x; [. @0 W
: m; B& f3 {) a! G. p0 R. [
             return SysAllocString((BSTR)str);
- }$ M' H; I" W3 @, a  J5 `
+ O& T+ K% p* E% \& y* F      } ' @0 i4 T+ _: ^

# [) d) v) c# s* ?或者参考一下VB下调用GeTComputerName的方法.
: \2 C% U- m. t' [+ H3 P4 \6 j* i. n: b/ j. j6 w  s0 u* ?( x
1 C9 B7 {- Q1 d/ m& y+ _! R( u2 a
+ s8 s' R/ S& a
2 u* k& s' q( `2 j0 v6 b0 R

7 f5 R- B2 [! F) t( M; e/ `! N  VC++与VB数据类型对应关系6 K- Y: ^3 }9 t8 q2 j! x  {

& i" j/ q- n  B7 V  F# W5 e, GVC++        VB
6 ?9 ]* M1 z+ j# k7 a7 S% Rshort        Integer$ }, S' R: x% s+ r9 P
int        Long- G" |0 g, m: |% u
long        Long
  n/ z/ p3 T# A$ n4 PUNIT        Long" x6 d1 H) ?- x# }1 J
ULONG        Long
2 Y4 k  \/ S& H1 G; jWORD        DWORDLong
9 o& |  b7 X5 X4 g7 e( J8 }WPARAM        LPARAMLong
5 ~+ X, x2 Q2 C. z; v8 }: o5 |WMSG        UMSGLong
& Y6 Y1 w5 h4 m) EHRESULT        Long) b' u2 J  ~; V* a
BOOL        Boolean2 y& m9 f+ u) @0 R- F& k& U
COLORREF        Long
9 z1 `0 S  e7 ?$ g7 K& vHWND,HDC,HBRUSH,HKEY,等等        Long
" Q( l, J, G) B' t- ]: {LPSTR        LPCSTRString4 L1 w! F0 t3 z
LPWSTR,OLECHARBSTR        String) f% b9 K( H! d; Z) u( k7 h- @. \
LPTSTR        String
6 q3 t% N' ~) \& A1 @7 qVARIANT_BOOL        Boolean% l9 L; @) c  K  W' }
unsignedchar        Byte& d$ {  K9 I" O& Q* ~
BYTE        Byte1 q, Q0 G6 ]5 Q( \9 d8 G
VARIANTVariant
0 @. c) I% Y" F) P6 f6 B; z, g& i5 j(任何以*或**结尾的数据类型)        Long
: U: d1 J7 c$ d$ d8 y3 L  f; H1 B8 j' c/ \# B
) R/ m3 H: W6 `" U; N! @" J% m- O  o
c中的数据类型        VB中的声明        结果
& w  s2 z" u. `+ }6 o                  
8 ?+ K& d5 a! O, m( U/ ?! h8 WATOM        ByVal variable As Integer        结果为Integer 类型的表达式
2 d  j! H4 ^/ k6 d) R0 [. T+ ^; WBOOL        ByVal variable As Boolean        结果为 Long 类型的表达式
- y$ h: F/ I3 vBYTE        ByVal variable As Byte        结果为 Byte 类型的表达式 0 P( ]. `3 B1 d/ x5 I  G
CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式
( F; N7 z) Y% U* H4 ZCOLORREF        ByVal variable As Long        结果为 Long 类型的表达式   A2 v( a, X: l1 u8 a8 W: H. \1 K
DWORD        ByVal variable As Long        结果为 Long 类型的表达式
2 }, u- t6 M/ i8 u. V) Z2 vHWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄
. R% \2 R7 K9 r9 i& L5 j4 ]INT, UINT        ByVal variable As Long        结果为 Long 类型的表达式
. E1 p# o  m  ?5 B1 r9 N  VLONG        ByVal variable As Long        结果为 Long 类型的表达式
% C0 R( [7 U/ Q( q2 MLPARAM        ByVal variable As Long        结果为 Long 类型的表达式
: a* ~8 C6 F( A0 GLPDWORD        variable As Long        结果为 Long 类型的表达式 ) A+ g1 g4 I9 x) e6 s2 v
LPINT, LPUINT        variable As Long        结果为 Long 类型的表达式
8 H3 [( x, c8 r/ qLPRECT        variable As type        自定义类型的任意变量
  O) R. c) T" y8 CLPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式
0 E. O# h$ M! VLPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)         
- @4 [  y1 n) f" X& o7 i+ |LPWORD        variable As Integer        结果为Integer 类型的表达式 5 Z) y8 C8 b5 g) X$ M/ {
LRESULT        ByVal variable As Long        结果为 Long 类型的表达式 ; R: h- i5 t4 r" x# V
NULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式
+ V8 B, U3 H: z% EVOID        Sub procedure        不可用
: X2 h3 P9 }: yWORD        ByVal variable As Integer        结果为Integer 类型的表达式 * U, q& T/ m! n) c
WPARAM        ByVal variable As Long$ A; K& B, O# ?: |4 g  ^5 U

  j8 m" `9 q/ b5 I
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了