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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:07:57

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑
1 j) p3 E! x! b3 e" y# F
3 Y: v' ]; t4 }4 e8 y& R7 Z
4 L$ E! k; g/ S& |以下内容转载来的 部分亲测 部分未测试
- U" C6 @! _" @0 A& Z
( c4 {0 S1 @  H# E3 J; q; m
1 W) E5 f+ S$ M$ V4 a* t; Y# n- s
# q5 U- u7 n+ Y( p8 _: p; gVB调用C DLL时的参数传递! ]/ Z. r0 w% y- M, I

& A: Y. @/ U8 y' l6 L2 ~& Q函数在C中的原型,参数类型和传递方式 对应关系   
6 J  n1 q& W' d
- P" p$ T$ a; c- ?; v  R0 I. U; o
+ M* J% k5 A9 d' ]) R- z
C DLL 原型         VB声明                 VB调用
/ ^7 ?* l& ]- E2 [) |- f$ W; ?8 W) Z& a! \, j
USHORT a         ByVal a as long           Call func(…,a,…)
3 F( @6 I; O' H! G, _/ h4 K, q& u$ L
int a                   ByVal a as long           Call func(…,a,…)
; @1 g* F1 }2 a4 |8 j* j( x& z7 ~0 y. U: `; P, _) w
long a                ByRef a as long          Call func(…,byval a,…)
' m: \: ~7 I5 S. c# [4 c" h7 m5 Y" [- y2 r+ Y
int *pa                ByRef pa as long        Call func(…,pa,…)0 ], U. p4 s0 \8 D
. \7 \; _8 P6 e; ^' D9 b5 C
long *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)8 c  g8 Z6 g9 k0 o- n

& p) ^  x8 ~* c- T+ ULPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)' ]9 q3 ]4 Q- P( j1 F
& s) f+ J4 d% ^+ L( n7 @
char *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)
% l0 W* |& I- M8 @3 `9 x8 U* h& y) g1 P- N' I5 l( {, H# ?2 F
wchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)8 o+ _$ A0 m/ U; ~
. v4 y$ ^6 X' T8 w4 Q/ w
struct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3) 1 V1 q8 C# a- ]8 ^
1 z8 x$ z/ }! b
HANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4) $ \5 |+ t% _- v  D
9 _. v3 t/ g7 [& ^" v( N# J
备注  7 o  Z6 W' G2 @

( A- F/ o7 ~1 ^5 \7 H1)不推荐使用此方式- e3 ~$ M- K: p8 ?, u& b' w8 X$ I. u
! J" C7 ~$ g+ ^  B& v: }
2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50
4 w0 d; z" j1 V3 ^! h4 [  b8 ^$ M1 V9 N8 K1 n- O$ @9 {
3)用户定义子类型必须用ByRef方式传递,
! p- a/ ^) \$ `" B' U+ W8 Y  p. ?" n, A' ^/ x
4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。 - P$ d# N: ~. I2 g. a. {

6 Z" g5 `* y7 |3 Y; L
' O; R, C* ]. z/ _1 E& Q4 k1 l3 t# ]% [2 d9 c; P+ p4 V) n) R1 V  L

: Z( D' i. _% n8 d* H( ?5 I, U1 I
) ]% s7 x1 r- x, e4 S; a! ~; s  j4 ]9 m9 G2 b+ V) Q6 J, V
% W% M9 R. {+ j6 v  ?$ {
数组传递     3 F: e1 O* j* R8 `$ \+ b5 N, g6 {

6 X% E7 `5 E" `        数组传递值用ByRef$ G' b/ l( T! S9 C3 G" Y

4 y  D; C6 C) k+ s9 L; j" E        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。
7 y+ Y0 j+ ?9 a6 w. s3 d/ a! F$ h7 ~0 Y% s7 h% s
. H7 B6 P/ U' B% m' [* ^+ X
- m3 S! h" }# y8 y8 k
         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。" ?/ E: _! w" C  a9 D) c, T9 c- i

; N0 W# e6 i8 s; g5 r+ V' T
/ E% d2 F# I) ~/ r, M8 u
4 o% d8 a; D6 t3 D7 G0 A: G+ o) E. ^4 r8 R' @0 _) {
: T5 x7 T9 o' Z4 j, c, @2 l: |
dll函数直接返回字符串
: S- \* U! c5 k4 w9 H0 J2 e6 s" G8 W. j% k; {) p

) s+ P. I; M, r. B2 ~
; J% Z% X% ^- Y8 L; E        VB下的字符串格式和VC中的char有些不同的
2 ~! ]0 t) P: F1 g1 W- r- i+ m: f2 e6 I% H/ [
        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子: 8 \, u9 m: V/ p- M: P& Z) h% f5 k

: Q# A1 r- A4 I) M% }7 f; s3 P, Q4 y6 [9 t3 p5 V
, a! P+ P, L( P- [: R
     EXTERN_C BSTR WINAPI RetStr() 6 x- p6 M2 w4 n, o

" m4 ~) n9 E- ?. @# S8 R     {
' j, j6 A- m& `) A. K* _0 q3 i7 Z8 |! H9 [8 q  Y8 h: [6 q
             char *str = "1234567890";
* p: Z- e+ O& o7 f+ Q  k. [8 M
' {0 Q8 q; X3 U2 l; q; b% {             return SysAllocString((BSTR)str);
% F2 @6 q! V# {- Q' J3 e! w6 X9 Z: f1 e& r" i
      }
$ X3 U* J: i) T% U3 m+ \
! e9 T' P1 a* U% w  \或者参考一下VB下调用GeTComputerName的方法.
; ?% s) X3 P( t% v/ D+ z6 H' C; e6 ~* A  v: x) p7 l
4 k" y* g6 P: l1 ]3 A3 Q+ A; _

+ P% x7 }$ m' \4 T1 u# G9 S' g8 h, w; u" x, z

  G, c( L7 U& r9 p7 r  VC++与VB数据类型对应关系: Z4 R4 X7 Y7 E1 b

) h0 N! f" b; u9 _3 p- j: x7 @; `VC++        VB: `% O& `: a3 n: D' ]0 u4 b- n! l' i
short        Integer9 D, Q! L( ?: p
int        Long
6 @5 F6 \- b9 K4 b! elong        Long* C  i3 r: I: g) U( v* Q9 ^
UNIT        Long  o+ o6 _" U6 [2 [6 j+ ^0 q" x
ULONG        Long
/ C5 {) R0 ]; J# Z& V  lWORD        DWORDLong
& E3 d. @1 u" i3 v+ H4 iWPARAM        LPARAMLong
) N6 U$ X/ }8 f2 h" _" Z2 x% zWMSG        UMSGLong! ~5 y4 G3 h: V0 R# w, ~
HRESULT        Long
. m9 ?9 i& A5 G# A9 kBOOL        Boolean) [$ y$ u. o% d! t; I$ ^
COLORREF        Long
& I/ S: X( P5 WHWND,HDC,HBRUSH,HKEY,等等        Long  K+ c3 H% t$ E$ A7 L9 n. b( x5 R7 V
LPSTR        LPCSTRString8 r- V8 z2 x. z7 K
LPWSTR,OLECHARBSTR        String
$ a$ q* X9 W, I2 g! OLPTSTR        String5 l- |% Z+ Z- C7 |& z* K, h5 P2 Y. v6 e2 f
VARIANT_BOOL        Boolean, a7 `/ E! J8 c0 N9 }& M1 S
unsignedchar        Byte4 J. C9 U4 [1 s4 n+ h
BYTE        Byte/ k0 z; e- Q8 Q+ q5 k' @
VARIANTVariant
' |+ X8 `# D2 Y3 @1 W. O* p9 G6 J(任何以*或**结尾的数据类型)        Long3 M! g+ v4 s- C% m3 P
% F- U1 H: J/ ~4 W1 f  n9 t* \& ^1 ~
. n2 s7 t/ U# U. q# e2 d
c中的数据类型        VB中的声明        结果: G2 i) n7 L4 J" A- D6 [) i
                   9 `3 C* X% @9 c7 x3 d
ATOM        ByVal variable As Integer        结果为Integer 类型的表达式
. X7 E% P6 e/ r  m: u5 ?BOOL        ByVal variable As Boolean        结果为 Long 类型的表达式
$ v# ]8 \; ?$ H  ^* xBYTE        ByVal variable As Byte        结果为 Byte 类型的表达式
7 ]% {2 X* ]+ YCHAR        ByVal variable As Byte        结果为 Byte 类型的表达式   ]/ g% E* z& m1 ]& l
COLORREF        ByVal variable As Long        结果为 Long 类型的表达式   c: X7 e. A; X& h
DWORD        ByVal variable As Long        结果为 Long 类型的表达式
4 N: R1 a8 |( K* JHWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄 + n% a, h2 b% k
INT, UINT        ByVal variable As Long        结果为 Long 类型的表达式 % w/ S2 f+ g$ A5 \
LONG        ByVal variable As Long        结果为 Long 类型的表达式 " O4 A. V5 ^3 f3 o
LPARAM        ByVal variable As Long        结果为 Long 类型的表达式
  @; d# e  ~# ?- M- l. gLPDWORD        variable As Long        结果为 Long 类型的表达式
3 S, C) x7 s8 v. J2 r3 B# w& yLPINT, LPUINT        variable As Long        结果为 Long 类型的表达式 ! P  U( b* {7 D
LPRECT        variable As type        自定义类型的任意变量 + g: t% {9 |8 ~/ `9 J5 w
LPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式
; w8 m  Z% E& Q: nLPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)          8 w2 C1 R+ V# H/ f
LPWORD        variable As Integer        结果为Integer 类型的表达式
$ q' {4 S' |. G% j4 eLRESULT        ByVal variable As Long        结果为 Long 类型的表达式
+ P  k9 \1 ~0 lNULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式
0 v' W: Z  w, R& X+ s* WVOID        Sub procedure        不可用
* V: G, M# u! d( Z/ CWORD        ByVal variable As Integer        结果为Integer 类型的表达式
: L( Z' z2 q) a9 LWPARAM        ByVal variable As Long
, U3 P3 S  w( z  t2 u% L
+ `5 D- d- E! U8 D1 K
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了