PLM之家PLMHome-工业软件与AI结合践行者

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:07:57

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑 9 Z7 P% @- ^% N7 g, i) z, n

: J$ V, W. p# E
: T' }2 b1 I$ n" c# @以下内容转载来的 部分亲测 部分未测试% @( n0 _" {1 H7 s  q1 m
# m! }4 V7 I" A( t3 Z1 X/ U

1 A* S% \$ f; ?- a
4 U% h# I* Y* B' T) b8 ?( M, R: XVB调用C DLL时的参数传递
, c: u6 Q. T, Y5 Y& n& W! q  o7 @5 `+ _1 `4 N7 F; Y  f" _. |
函数在C中的原型,参数类型和传递方式 对应关系   
  O  G: h: m, M* ^1 k7 u2 a7 g5 H
9 r% Z/ s8 I- U+ O! ]' K
" A4 L' ^+ g' {* ~: V4 a2 T' [+ Q4 q6 i! n# |) f
C DLL 原型         VB声明                 VB调用
8 r- n, H3 O- J6 r% R1 Y5 O* F5 i6 I2 D
USHORT a         ByVal a as long           Call func(…,a,…)
/ r9 S% h! F' A4 w/ h, e
& e7 |' q* ?) aint a                   ByVal a as long           Call func(…,a,…)
+ Z' S% F2 O7 x2 m- M& S. s2 m; T% L  J3 k1 \; {9 R
long a                ByRef a as long          Call func(…,byval a,…)$ }  A6 _) N$ A, n3 m9 s. z

! U3 {5 S; R2 K' t$ k% _* pint *pa                ByRef pa as long        Call func(…,pa,…)
8 g  N# _: H3 m' X6 b4 Q/ t8 t7 q& U5 G- f
long *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)' u, m! Z: c0 ?( a* O

, B; f/ Y& G2 {8 {: XLPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)
! T9 E2 N# Y. ?9 o  w3 W! L8 H* B2 `4 f. w5 B
char *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)
# N/ j5 X- \1 c2 K; [4 M4 c/ |! G
- a! J: x. S0 C) o7 T/ awchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)9 {* {8 [; W; H5 J, r
+ J5 }' M+ B9 C  Q/ B# m
struct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3)   S- j% k; o% V
+ D3 k9 ]  {3 t2 Z
HANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4) & ^2 q+ p% `) A3 v5 x+ V

* r2 q9 ^  G9 Z& R6 i备注  ) i6 J# f- y( k2 {

  S5 P( w# a3 C2 r1)不推荐使用此方式7 l5 W) O* A6 ?4 Q3 ], {
! ~8 U' F7 m5 J* e
2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 507 U+ b) P' ?. E
3 n9 K% p5 |# ]) H+ Z% ~, p& @7 X
3)用户定义子类型必须用ByRef方式传递, 3 G+ e/ P8 e1 D/ k* l

" ?$ T& i' L2 g: Y4 `% V$ d4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。 ' u* Q* f9 O+ F: n6 v; }& y

0 j! ?8 [4 y4 X$ I0 m: \- e
6 @' s7 `  Y. M& q% q+ F* j
, [0 K; {- n1 Y+ u% O
; R/ q" e* u6 X) `) E% G4 @# D/ G2 h$ S! S- d
2 a4 b4 X4 a& F8 h3 m
2 ^" V9 v* w- }6 a
数组传递     ( ^3 ~, H" R# `) F" Q  _
- B& c  D9 ~; e# E9 \" J
        数组传递值用ByRef: \& \% S$ ^$ k4 r
9 C2 m% ]7 ]' S+ [* r& \  r9 ]
        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。$ d7 n2 g- }; i  e* _

. r( ~7 b6 e) R5 ~
, C! l! }3 a7 @) {5 |# p3 Z: k7 J# t/ B: X* X0 D4 ^/ S3 `: a
         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
" Z+ X* L7 l' I/ v
7 p# l/ ]% ^8 {$ r, |) l
' i' [/ \7 v2 q# O( H8 u; [4 m2 ?7 n1 R7 Z% x5 H- s
8 n9 C* p4 Y3 {, X  I& D- X( w0 y
8 K8 `6 S( }/ b% E& r/ t+ y; L
dll函数直接返回字符串3 E7 I0 ^6 k9 g' {

. u$ o* ?- W3 j+ q8 v- t) ~6 e* A* O; u9 r" D( k) q0 N# V1 |

/ v0 F9 K( X7 Q4 v' J* V/ L5 N1 G        VB下的字符串格式和VC中的char有些不同的
' K' F4 n- O3 q0 T+ v
7 e. j" }. `$ H# t        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子: $ X" C4 p2 d4 V

4 W! V. u7 S4 f& d6 R7 t( R7 T6 ]8 a( n
. q( k* Y# l. e* K
     EXTERN_C BSTR WINAPI RetStr()
$ _, z% z: h6 j0 y. y6 ~) J! D0 i! N7 f
     {
1 l- c+ r) ?/ g5 x" {& j' n( {: e: C# x& W! R3 P- P
             char *str = "1234567890";   c6 l, o+ ^" _( g9 k
& k+ V& _8 H7 ~0 q
             return SysAllocString((BSTR)str);6 W, ~8 j2 O3 G% P
! ~& V& U- Z+ |# \6 t# |
      }
1 l- `& e1 D- j" v% C
8 S0 p, ]% l2 @, D: G) L* w或者参考一下VB下调用GeTComputerName的方法.
9 y1 s+ Z+ N7 @- w6 H; A" ?' P. V  G- V9 Y3 `" `- s# E5 ~
3 I; D+ A  Z% ?( V- s! f, t9 e
2 Y4 r; l0 g9 E

, |( m/ J9 W% n9 z! @( h5 y
" F& o* b( |/ W3 Q  VC++与VB数据类型对应关系
, Z3 }2 G; _* o3 T, R6 u, I
+ [! r/ q+ G! W  @7 n3 d$ pVC++        VB0 I  C+ h& k* }2 ]
short        Integer
) Z3 ^; |6 w, x8 |int        Long
0 N+ h6 a6 l  D0 H* qlong        Long
8 x0 p2 y# ^4 m# d3 J& @' _! h8 RUNIT        Long) b2 |0 z; \7 ^
ULONG        Long0 Q! t) a, R' I% t" y5 S
WORD        DWORDLong
) z, y5 W8 q: g* hWPARAM        LPARAMLong) b% D: p; a' l
WMSG        UMSGLong5 n7 y/ Y3 a4 r3 T- T4 ^# C
HRESULT        Long4 b) P2 Y" K) S" N8 E* G
BOOL        Boolean
, s' s; X, B6 z1 eCOLORREF        Long
. s) U" g- K/ |5 z( S* p& y% T$ T5 D& FHWND,HDC,HBRUSH,HKEY,等等        Long
  E3 i" {( ~5 U0 ?* P& QLPSTR        LPCSTRString
' q$ J, m  k" q5 r. jLPWSTR,OLECHARBSTR        String. B$ m# i4 N6 w
LPTSTR        String
# f& K2 j9 o: [/ TVARIANT_BOOL        Boolean6 H- z+ b/ ]: F
unsignedchar        Byte* H& h  A+ w6 H
BYTE        Byte* f4 q* q8 r4 e; K: Q7 l2 y
VARIANTVariant9 S, @# W8 a3 d# U
(任何以*或**结尾的数据类型)        Long$ r( O) B* o: m. y2 P
' R5 c! v/ Z. a- k7 U7 t
6 p7 {' S$ Q' y
c中的数据类型        VB中的声明        结果2 h2 B" l( b! q# {% E! d' U) N% m4 o
                   # c1 V5 x" z  D  f
ATOM        ByVal variable As Integer        结果为Integer 类型的表达式
+ k/ Y6 M5 k$ L4 s/ PBOOL        ByVal variable As Boolean        结果为 Long 类型的表达式
& p2 Q' ?& L( g. x4 O, Z- IBYTE        ByVal variable As Byte        结果为 Byte 类型的表达式
/ W, ~( U9 K5 N+ u( B' K) yCHAR        ByVal variable As Byte        结果为 Byte 类型的表达式 ' `4 Z7 o6 H# \; s+ W
COLORREF        ByVal variable As Long        结果为 Long 类型的表达式
- ]: F, w, L! w: ?' }DWORD        ByVal variable As Long        结果为 Long 类型的表达式 . ^2 ?. H- y: m3 U8 Z7 @' ]8 b
HWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄 * L6 H4 c! N4 }% ]2 f4 o+ W/ L( N
INT, UINT        ByVal variable As Long        结果为 Long 类型的表达式 ; t' u+ m- K: D, Q; E+ N1 h
LONG        ByVal variable As Long        结果为 Long 类型的表达式 % f8 {3 i- [, @0 V8 q# \
LPARAM        ByVal variable As Long        结果为 Long 类型的表达式
5 E, X6 f0 P) fLPDWORD        variable As Long        结果为 Long 类型的表达式 $ j2 z6 e) w- i+ F
LPINT, LPUINT        variable As Long        结果为 Long 类型的表达式
% i" K2 k9 F  X6 I6 \9 F: uLPRECT        variable As type        自定义类型的任意变量
' ^9 r8 ]+ s9 }+ pLPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式
: n! ?9 Z& m  b! e4 f9 uLPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)         
6 l1 i5 e1 U+ F; r4 i' ]! Z; OLPWORD        variable As Integer        结果为Integer 类型的表达式
) F6 M  i" f# {6 d4 z) nLRESULT        ByVal variable As Long        结果为 Long 类型的表达式 # ~: O! I3 J, Y* |! A( J! O
NULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式
1 F+ l& p5 b! q5 C4 c# W+ BVOID        Sub procedure        不可用 $ r0 j* T: a% G& h0 B5 _
WORD        ByVal variable As Integer        结果为Integer 类型的表达式 - |7 l& ?  s' W0 S+ r. |) {. C
WPARAM        ByVal variable As Long
# i9 Y- p& `% b* F# `# t  _3 E' M. z" R  E$ c& S9 L  ^
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了