PLM之家PLMHome-工业软件践行者

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:07:57

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑 - m- G- g- A* _& e% f( [6 ?* N+ ~% b
  C2 N5 J$ T: S2 ]# v4 V

" O0 E, K+ @1 ~  p1 f' R: y( F8 L以下内容转载来的 部分亲测 部分未测试
, H$ _% b2 x6 q; T6 g6 D
! U- ^% b+ j( X0 Z4 ?9 Z7 \7 @7 S$ b3 e0 ?' z/ H' {' b  ?$ l

7 v3 L7 M8 u/ K1 b# BVB调用C DLL时的参数传递. m7 t5 O! f- ]4 W# |
9 p) d3 F4 _+ C7 G) [5 [
函数在C中的原型,参数类型和传递方式 对应关系   2 r1 k; Z& N! C* ]0 @& _
) ?; V7 k+ f: J5 M( B! n
. f( N2 w8 l* T) u: w

6 h& V6 G; A( O2 q4 ~C DLL 原型         VB声明                 VB调用: U. E% Q& U9 v4 z1 e. g
9 ^: A9 g+ U* ?2 @+ E& P6 W
USHORT a         ByVal a as long           Call func(…,a,…)* L$ m1 T" J: G) E7 }' |; d

- C8 p+ n$ z0 n& S' M# B- G) Hint a                   ByVal a as long           Call func(…,a,…)
; w' [# @% W& i- d, {1 W; f5 K: C
9 W3 q2 N5 F9 b+ g6 l, jlong a                ByRef a as long          Call func(…,byval a,…)
# h1 V% I2 P( A0 D
% a6 i# u3 r! c3 uint *pa                ByRef pa as long        Call func(…,pa,…)
0 s# b  j: x7 n# b* A+ P& i: k' }8 }. g0 \3 O$ A1 |0 |
long *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)' f& u# Q- d8 t" t4 \
" _9 V8 ?& x9 d: Y
LPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)( _  \- G# F/ j
- l  F  k$ z* U. J" X9 k- n1 V
char *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)
  n: O! o$ N3 a+ L7 t) v) u  W5 t. j9 c( L+ v$ q, o$ G8 A
wchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)
( O/ e4 [0 s9 }2 e
7 [- G+ Z/ S! ]7 N1 V+ V* Hstruct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3)
' g' @& E  P7 U: y+ e4 I0 F  W, ^9 W
HANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4) 5 q: z" |7 r3 _# Y: `' Z
, b$ L3 h4 D% B  u
备注  ) U+ T1 @0 ?( _' e) O: `4 f9 u0 y

/ u* [) \8 d( _3 {1)不推荐使用此方式
, r5 F: f3 f6 T7 p& n+ {2 B$ S# c6 Q0 c
2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 505 L! N9 i  v" J
0 B# G: @$ |  t+ s% @$ t
3)用户定义子类型必须用ByRef方式传递,
1 y  E" Z* p0 g8 Q3 I
/ u7 ]- O+ Z* W9 B4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。
" m. k  S1 F8 f/ g5 B) F
- {+ v  }1 a* _+ T( \  |9 y: w" G2 K2 P9 d- a9 n+ T
) s8 f8 S# ~1 A) o3 ?& u/ ]
% q; I6 [' s" Z) Q' t- C

* R7 z* _7 B! I) G% u- r! d& E; i( [) p, E( O" b: Z6 `
3 M. y( T1 u$ B: w- i+ I
数组传递     
# t/ f( e- s0 {( L; A1 P5 x& ~6 O  `; Z5 P7 i
        数组传递值用ByRef# D, p7 o8 _; M& |- t. b7 r$ g
. I  ^, U% v$ Q& p
        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。$ E4 P  y. T9 {1 [6 b
7 Z# k$ H. j* Q6 q7 ?- a
6 c* d* X5 {6 f& E1 O

6 F. w2 v8 C2 h4 n9 v9 Q+ n         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。& h9 R( \7 ]; B$ c/ P# ^( b& ^+ D
3 n) g8 f, y! n
0 v9 Z6 F& E; A; g4 w' D( w

; C( ?3 f' W* b* M: N
3 @* O) K$ F) j4 V& \' x6 l+ O9 y! e  j( ]
dll函数直接返回字符串; e5 d( s* w& v- D! T4 D% A% [

8 t8 @( K- R7 u* L
( P6 s0 m+ E: Z  t! w
. P3 E/ f  ?* ]  n7 v& N9 \        VB下的字符串格式和VC中的char有些不同的4 z' o- @* Q/ f! {/ o, v& h
: V5 R4 U6 p" V
        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子:
0 L; T- s# f5 F  P" G2 H2 `
$ N5 u1 x" x: j$ d9 \) x; n6 {5 y. p/ f

# Y2 i! A/ u5 T7 `& n6 n     EXTERN_C BSTR WINAPI RetStr() 7 E) l. N- ^: E
9 i& }* E+ N  c2 ~3 B8 o
     {
: Q0 {/ {0 s( R  F& Y' w3 g5 H1 v( R) Q4 F2 ?; V
             char *str = "1234567890";
1 A0 O) H2 f* V) z7 \+ e( C8 ~; H1 a- q) u
             return SysAllocString((BSTR)str);
, h# V( N- |% x2 M: Y7 O, F* y
. h. f! g$ g: K& s9 G" ~      }   \% s4 X1 H" H# O8 ^0 E) E

/ f: l! ^& q2 ~4 G或者参考一下VB下调用GeTComputerName的方法.
! [6 P0 |1 ^, s' N: D; ^( ^9 J9 I: n% y0 k$ L, X5 ~6 {  g( N6 j
- s+ P& T) I& Y% X4 z- w

2 V* G, `7 W: _
" V/ j/ C/ a3 `9 i  _! N' f6 H4 e( [& A- d7 @1 N  D) I" r
  VC++与VB数据类型对应关系
+ A6 ^4 J9 Z( n. d7 Y: y
; u# q& C( F* h' B$ pVC++        VB; T$ J4 a  {2 ^9 o
short        Integer
, K$ `/ a9 y& C' m& w. q( b5 w; Uint        Long
" Y, a( R7 M3 O% G& N5 Clong        Long
7 \  C/ T- S# MUNIT        Long+ ~$ _. k8 w- |
ULONG        Long
0 ]- t/ p+ W# @$ w8 XWORD        DWORDLong
7 k" v# `# R  M4 k* K) ^WPARAM        LPARAMLong
4 e$ S* w/ J: k# O- \) lWMSG        UMSGLong% F- |4 n/ J# W" k% N; M
HRESULT        Long
+ e8 ?& T+ c+ C% y' D- p; W* M$ pBOOL        Boolean
! i* f& Q7 g8 E9 R0 UCOLORREF        Long' [' b* a5 P) {8 H* B3 E9 F! m
HWND,HDC,HBRUSH,HKEY,等等        Long
6 _0 e' H0 `; J( g+ S4 ]LPSTR        LPCSTRString
- v2 M# ~( C3 n( y+ h+ oLPWSTR,OLECHARBSTR        String
) B7 m; w; N* O- hLPTSTR        String
4 e- l) y& Q/ xVARIANT_BOOL        Boolean
4 z* a; o' D- n8 T& Kunsignedchar        Byte: ]. w0 n. V- @, {% x0 h* [
BYTE        Byte: [% A  d, _; e+ d1 D' D& N, Y# ]
VARIANTVariant
; S2 O3 c) q# m& q(任何以*或**结尾的数据类型)        Long% X& W" ]) a" y( n$ i3 g* L/ b
9 ]; Q5 J" F9 e) z) W& x  K. |

5 i- e. }3 X( m0 d2 t1 Rc中的数据类型        VB中的声明        结果" U. M# r4 g5 r& U' d9 ?
                  
6 A: g* s/ m9 c( f  v( w( {ATOM        ByVal variable As Integer        结果为Integer 类型的表达式 9 g% W0 }9 C. c6 D% s' O2 O% x
BOOL        ByVal variable As Boolean        结果为 Long 类型的表达式 ! o, s& m1 O* C4 C; ^- {- F
BYTE        ByVal variable As Byte        结果为 Byte 类型的表达式 1 x$ T' O% Y: b' d
CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式
* d1 t' ~  B6 N, E& _COLORREF        ByVal variable As Long        结果为 Long 类型的表达式
; x$ g! q7 Z( @# z2 [DWORD        ByVal variable As Long        结果为 Long 类型的表达式
  _# T. S* n4 J0 G" R9 HHWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄
( ^" m! Z. y- P  FINT, UINT        ByVal variable As Long        结果为 Long 类型的表达式
) W# d5 H; U$ V1 `LONG        ByVal variable As Long        结果为 Long 类型的表达式
! {+ o6 H' p- Z2 M9 XLPARAM        ByVal variable As Long        结果为 Long 类型的表达式 4 v5 z3 U$ r% z7 p8 s- g6 B
LPDWORD        variable As Long        结果为 Long 类型的表达式 4 X  c/ I& [1 O
LPINT, LPUINT        variable As Long        结果为 Long 类型的表达式 6 A0 T! g& ]: O
LPRECT        variable As type        自定义类型的任意变量 6 t: c# w4 \. S( g- ]1 _8 `
LPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式
& B/ @" `7 H6 {LPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)         
  h4 B; J# ~2 i" J$ W6 }4 kLPWORD        variable As Integer        结果为Integer 类型的表达式 4 R# U1 W/ A2 F
LRESULT        ByVal variable As Long        结果为 Long 类型的表达式 % k9 |" `$ m' K) D1 v
NULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式 2 T1 ~0 h" D# i! Q/ h% n6 R
VOID        Sub procedure        不可用
) w! N, C1 m9 |8 d8 b/ b! n4 T  _WORD        ByVal variable As Integer        结果为Integer 类型的表达式 % I0 Z  V$ [* }1 ]
WPARAM        ByVal variable As Long) D% h/ L  A4 I2 v$ \# @
0 p0 {% m$ w9 K- @# Q+ r
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了