PLM之家PLMHome-国产软件践行者

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:07:57

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑
6 v' H+ W% h9 h7 Y1 d( O
5 K4 ~& z. \: F* b+ e1 E# G7 P7 @8 u, \( U
以下内容转载来的 部分亲测 部分未测试  O" E0 M( u9 b) b
9 N2 x. ^2 [: U

% A8 l3 L5 t& _. R2 b. ]8 b: J
$ _8 p# U% p5 N* u1 w9 Y& lVB调用C DLL时的参数传递( S5 n* {. o4 D+ A' L

, J9 A$ R" ]0 \  l  X" d函数在C中的原型,参数类型和传递方式 对应关系   
$ U/ C8 `# v- P9 \0 u; I% A  I
- V8 \' }3 r8 g% e3 t) Y2 `4 B$ z2 K% [# [

; _# z4 d* u; v. ?" zC DLL 原型         VB声明                 VB调用
3 M1 |* C  Z# o1 ^; ~- x3 L) h
7 N+ ]3 n* u, H5 R5 \2 G3 K' RUSHORT a         ByVal a as long           Call func(…,a,…)7 U5 _9 J" [4 f* u, x# z
5 d& G- r5 X% _! R
int a                   ByVal a as long           Call func(…,a,…)
5 t1 ~# c2 o" Y
! B' H1 p3 P- _1 X% a* qlong a                ByRef a as long          Call func(…,byval a,…)
% o8 y6 o1 N7 k( V* G% K: z( R! f+ n% C2 x# v, @3 V
int *pa                ByRef pa as long        Call func(…,pa,…)
- Q/ e, p2 Z+ \7 J7 a" _
6 j8 r2 z. [/ h& f* ]long *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)
4 \/ Q4 {: w5 X2 ~3 X
$ G, s$ O/ G% o0 m/ oLPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…); a. r# n) G$ V6 c2 Z

" ?7 S* S. ?# m' a3 d; J: _! hchar *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)5 o) D' N- b8 T6 H# Z6 D
4 y1 r' }1 z6 D+ z+ [7 Q4 k
wchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)
1 J9 d+ b, Z- X0 G
5 k/ a5 W, t. g% A/ _  T8 Qstruct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3)
# N. u5 [6 l$ ?, Y' y/ [
0 C4 I: W3 F0 S2 o3 g# {3 K& i/ rHANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4)
4 ~6 O7 _9 d5 D" T: e8 u5 O. Y4 `# G! l4 T; O; e3 D
备注  
) H- r( e( a. g" {) H/ J$ s( j# I1 f0 `7 s" C) n4 o6 L! f2 s
1)不推荐使用此方式
7 `8 v0 K7 T- l) Y
* n( W+ D$ J, Z. J2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50
/ x! N5 E; I; x; R& x7 C% i# u' r" j3 x7 H6 |, V% P% L0 C
3)用户定义子类型必须用ByRef方式传递, 6 k# l7 O: |, T) }6 G* S

7 M/ X. k: M0 p( R- i1 J1 q4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。 ; L" d; X, n% }& l) \
& y/ O# f2 R0 x2 C) a- L3 e

3 X1 W- r( b/ z8 ~- J
: X) L5 h+ @) |( _1 J) {9 Y% p% q- ]$ S5 M- F$ H/ w8 k

* m( M4 C7 F8 I1 D; q" n% Q8 S5 }5 _& V4 y) S* n' r

+ v3 e( X& l- }! H5 U9 }7 t数组传递     
) O. F, r' P+ Y- j  m4 m0 e0 t/ O4 t0 t8 u/ c
        数组传递值用ByRef# q- K( \, [8 Z4 m
6 u: o) A5 i% y3 J) z
        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。- W% M3 Z. o; ]

5 H& p5 f* `8 C& `6 x; c8 U, w1 I2 i

, F* ~' g' d! |( z2 X         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。" u& p2 I& Z% D* K
2 w% W( F/ S* H7 t* j+ [% g
4 b. X' ~: P5 s. o6 S- c" \
* R- n& R8 _) }. s( k6 S( d: S
9 B5 E8 d5 c1 k' t) v

: ^% Q1 {* [% j$ Edll函数直接返回字符串
; E7 A6 G0 ?7 c' |2 R. l6 o+ e( P0 |9 a. ~3 s
' ?! z& n% S4 j0 p3 _7 S& L

, C1 E: p+ J2 a3 s. B- I) ]& p% g        VB下的字符串格式和VC中的char有些不同的
/ e7 x4 h, i1 x6 ~+ Y/ R; ]  V  K- F
        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子: & ?: [( i/ D5 s9 O1 D/ e/ c4 {

! t' R! m) {2 r# j) s0 Q
7 ]; ?$ R8 M5 O, j) x( J9 ~
; k% `  q5 f* f! o0 W  T4 Z* N     EXTERN_C BSTR WINAPI RetStr() / v) d- y8 m, f* F0 |/ `1 [
7 ]( O& j: q0 W* ~3 O
     { ) g9 P) T% w4 ^8 O2 ?1 L# s

4 u  X! l1 D: S0 k             char *str = "1234567890";
, Z! o) L6 H2 O5 V2 D6 L: Z  E3 T: L: h! p+ z" Y; y
             return SysAllocString((BSTR)str);
5 t& }( c" a0 [$ j, t1 |1 G$ a# o1 F3 t" J& ^$ C: l9 z
      }
4 o" u4 u3 y# N, h# F! s' [, i& {/ _
或者参考一下VB下调用GeTComputerName的方法.
) h8 h0 q- L' v' t$ |- L* N5 S$ y
7 R) b; D. Z+ }% I0 B7 n* r
  C/ Z2 Z( h" w" u6 Y" N
. J6 ~. k/ |1 ^0 E5 N) ]/ t/ n0 _, r" F
" a2 L! V4 g4 E& }) t, e4 u' Q
  VC++与VB数据类型对应关系
3 g! C6 k: S- U: y, F; |3 j- G7 W( D+ I+ n
VC++        VB
% F0 p- C3 M9 n) \" \, D8 c2 U- yshort        Integer+ b6 b1 i! w1 n' j& ~5 {$ x# k  x
int        Long8 j7 Q3 `( M7 x$ E+ m8 K# d
long        Long( X' f: y* ^+ i5 e/ F
UNIT        Long
) N6 w7 ?5 I# G* i: @* c; EULONG        Long; Z1 Y/ f: p5 @! A# J/ w
WORD        DWORDLong, r6 o( s7 \2 a! L9 K
WPARAM        LPARAMLong
+ E2 j1 x+ }0 A. F5 UWMSG        UMSGLong5 R3 S* X. `/ x2 C; E$ O
HRESULT        Long
  A9 ^6 g& o$ Y( _% A6 c9 IBOOL        Boolean  S# E, C6 Z! x6 M" L) n: R
COLORREF        Long
9 z3 ]* g& a* T4 WHWND,HDC,HBRUSH,HKEY,等等        Long, ~1 \2 e# G! N4 P6 M
LPSTR        LPCSTRString
7 r* f+ @4 z( x$ `/ PLPWSTR,OLECHARBSTR        String
# L! x; S) S5 c  }LPTSTR        String
" j' K6 V) ^) S0 B1 V4 \VARIANT_BOOL        Boolean" w2 U) O" t) W+ j4 W
unsignedchar        Byte
8 e5 N& R* l- t, c# X# A) eBYTE        Byte
0 t; W- l1 N, `- iVARIANTVariant  C" Y4 a/ S1 R7 U* S: s$ j: [* j
(任何以*或**结尾的数据类型)        Long0 ?) l7 Z' k2 e8 P" B3 i  {
$ U* `9 U$ k; F% ]* H# M+ j: j
) k- L: P. v: J$ |2 l
c中的数据类型        VB中的声明        结果! x& M% J( X* d& {- q/ V/ v) F+ ~
                  
% p9 S5 M8 g/ |4 D! `" @% GATOM        ByVal variable As Integer        结果为Integer 类型的表达式
5 ?5 N1 z* S4 X8 }. O) ^, GBOOL        ByVal variable As Boolean        结果为 Long 类型的表达式 ' a% W0 V* u. V2 l5 P/ R8 R
BYTE        ByVal variable As Byte        结果为 Byte 类型的表达式 ' {8 H' p8 V5 Y8 d, U* K
CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式
, g7 o8 y8 e5 D, G: P6 ACOLORREF        ByVal variable As Long        结果为 Long 类型的表达式
" r$ c: [7 r, I0 Y6 vDWORD        ByVal variable As Long        结果为 Long 类型的表达式 - V. r& X- t2 x& Y$ Q( }+ B
HWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄
, U* f' m" z3 B% f( Z! HINT, UINT        ByVal variable As Long        结果为 Long 类型的表达式
- U( Y$ h- M+ [  k' A5 F' r: [) p: i% XLONG        ByVal variable As Long        结果为 Long 类型的表达式
' R" `1 a% y" l# z9 o$ |- wLPARAM        ByVal variable As Long        结果为 Long 类型的表达式
+ C& [+ R0 V8 N* k2 O; ~( o$ m; {LPDWORD        variable As Long        结果为 Long 类型的表达式
' N3 [& h' u: _8 ]! h5 x: L" J" |, rLPINT, LPUINT        variable As Long        结果为 Long 类型的表达式 # k2 d1 K& d0 |3 [2 k3 V
LPRECT        variable As type        自定义类型的任意变量
* |$ X6 R5 P. V3 q# ~' Q7 lLPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式
3 g! P$ w% ~- aLPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)         
( [1 d9 J5 d7 j* ELPWORD        variable As Integer        结果为Integer 类型的表达式 ' \& u4 v- ^# [$ j8 u4 a
LRESULT        ByVal variable As Long        结果为 Long 类型的表达式
& `2 G0 e2 v% V& nNULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式
; [0 j' o; D" N; V8 h; [5 RVOID        Sub procedure        不可用
4 |) ~" n" E- ]. m+ g, A$ u  r  TWORD        ByVal variable As Integer        结果为Integer 类型的表达式 2 G( g, c7 I( X+ f, |
WPARAM        ByVal variable As Long7 S, H& N- o) B! |! v
# n) {* X5 B" W9 j
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了