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

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

[复制链接]

2016-12-11 15:07:57 2784 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 b+ J" d; e" H# f0 K

7 p" P& i5 _" W# E# E+ x' Z, o; l; k9 Y/ ~/ R4 a3 P) I
以下内容转载来的 部分亲测 部分未测试! h% d3 ?7 F8 ^& Z

( z9 J) }- S! x! j0 N3 r# S' R# U* h$ ~
9 J0 C! q6 W0 _) B& K
VB调用C DLL时的参数传递
5 x; h. r7 [. X9 N* q1 a. u1 `% `6 U! J0 L4 {/ D( T
函数在C中的原型,参数类型和传递方式 对应关系   
2 B7 P' p! A8 K' @+ t7 L% ]5 h
8 H* f! u2 ?8 I+ M6 _
3 d9 A2 L+ `  E0 y6 C% V( c; n8 Y8 V* E; A
C DLL 原型         VB声明                 VB调用
: w( _& C. n5 b+ ?
1 r# q4 p: M! \. H& KUSHORT a         ByVal a as long           Call func(…,a,…)
( u: j7 l1 y5 D( H" a0 O* [9 W$ z' Q1 P% m
int a                   ByVal a as long           Call func(…,a,…)
6 I  C8 f( z: s/ p3 J4 g3 ^3 M/ _2 C
2 }* F7 I) ^4 {& z  Q! ]) Jlong a                ByRef a as long          Call func(…,byval a,…)
* H- y+ F- Y1 @. O. Y6 }& x: u6 D4 s* S" v, T/ N5 W  F. P
int *pa                ByRef pa as long        Call func(…,pa,…)# M2 R  ?3 V; r" f2 m
6 ^8 ?. J" X" E7 j) f
long *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)$ l- Q5 _4 x/ Q8 j) E- O, F' V
& M2 W. Q9 c7 B) I1 c
LPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)
* `* `: P( F/ s# d: w# v7 F
+ b1 B) |# Y7 T, lchar *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)
( S# I/ Q$ I& A9 h" o
" q! z8 v- D* ]- jwchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)
( _* D- b! I. u! U4 N" `  D/ y( g2 f. y
struct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3)
3 J2 t4 y0 c0 k4 U* @7 X& a  h8 t- b$ }9 s* r
HANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4)
9 H0 T2 ^. m) Y$ W% ?7 ^6 I
+ h3 s2 q% _5 w备注  ( h4 Z" @( u: T  y+ \  d

% s/ H' `+ [( G" e4 @8 ?0 q, q1)不推荐使用此方式
, y; J3 _/ c$ L8 s, p7 H2 d
/ w6 _$ H& Q8 B! r) x5 o. ^2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50
3 M5 L0 ]: p: i* {# n$ E
6 y1 K: e5 G3 z3)用户定义子类型必须用ByRef方式传递,
8 X# j* k9 n0 @- ?3 Y6 d; D! B
  y1 ^, T' d0 E$ Z4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。
$ A& w+ C8 w  A8 Y" E" N. T% x
' N% k/ _# L3 }3 p) p
* I. d/ O4 q" N! N' p2 s' I& T* F" Q6 u: s

, `3 S% }: Z, W6 D% l
6 j" A% C3 I, |* q% H0 A0 {9 e
6 @1 z& N, j% e$ \4 m4 W4 J: `
+ b8 v1 j9 h& K+ s! N* [# c4 k! r数组传递     
* ?1 c0 V# U" q2 g1 W  h8 L' `1 K" w: j
        数组传递值用ByRef9 L/ I! Y+ o. L5 g
0 A2 y2 i5 I& H, W" @
        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。4 m* _, I* P; \

: G1 {' b% u; X+ G2 N( K: m, F. s# c, F% d6 S0 o  P5 O

. R% w& `) d: B" P/ B9 H         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
# I7 d3 K* G+ Y+ O' K& u6 e/ b) M/ A! ?7 w& o4 b8 K& i* p3 e! t

6 G# |" a# V( }/ L! I
; C2 n$ b2 v& X
9 p/ K, e3 l+ R  c
2 F, s6 z" X  d- V9 N1 adll函数直接返回字符串% v* T+ q# e$ \% ]- D/ F( ?9 J
4 h8 Q/ H1 p2 B) v1 p% j& y. _

* v1 |& e; H+ }* c& I& f1 x) e
" h$ w' h; n* F0 S( o2 b1 I) J% D+ q: X        VB下的字符串格式和VC中的char有些不同的# P6 I5 i& I+ W! }' U" P/ P- ~
9 R( ?$ Q' }# P7 \
        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子: 4 N5 i; b, ?; K0 N) l5 o4 I# h

( y/ w2 ]3 S3 e3 S) G4 j# w9 h' m) P( Q

# G( A0 S. C6 C6 X     EXTERN_C BSTR WINAPI RetStr()   j9 h" H, i5 U  Q7 b* o; I/ S: Y& c

+ O+ y$ Z% q  S) d% S4 v$ [* k     {
. a. T3 m% H; I. `* L3 `
) {+ a. Q5 a. \             char *str = "1234567890"; : j# I9 f) l7 r. K; t# u3 {
3 f0 b. z; t6 w
             return SysAllocString((BSTR)str);- C# T; j, Y( `0 }2 M, ^6 u

  E& T8 y# X# j6 M$ U/ @. d      }
/ V' U9 b# H$ p1 ~9 r# _- H1 g
或者参考一下VB下调用GeTComputerName的方法.7 P. [0 D: T: b- m+ x4 i% Q

6 }# o$ B* h( ^; L7 P. M  S: K. E% J. X( ~8 X

% Q; T# c: A& Z/ h% Y( ?0 l8 }" x0 s2 Q# z

8 l5 H; X- j+ D  j5 f  VC++与VB数据类型对应关系/ y6 h8 C6 [, {* w; t
/ e* c" p8 \( x8 v* S6 O
VC++        VB& d. `  _; W" o
short        Integer' z! W0 Z+ K+ s" W- C: j' L% J4 ~
int        Long: H+ O, Q8 k$ `) A( R
long        Long) ]- i$ |9 c" d0 F% \/ O
UNIT        Long% v& M# N' _( O. \
ULONG        Long* @! _: D4 ^3 q# |1 F
WORD        DWORDLong  r6 E3 ?: N2 _8 d
WPARAM        LPARAMLong
* E& h9 c% |8 ]- ?  LWMSG        UMSGLong
+ N8 G* b3 j4 UHRESULT        Long  r# n- q' z0 C
BOOL        Boolean
. ]% I% Z8 X5 j6 {; s$ ^COLORREF        Long1 o( I2 M) s9 q( i2 Q
HWND,HDC,HBRUSH,HKEY,等等        Long
- c, R; d0 x( m' p2 ILPSTR        LPCSTRString
3 o9 M9 G" n% H2 T1 \LPWSTR,OLECHARBSTR        String
; ?; B$ I( @% i+ Q! W4 O0 V8 rLPTSTR        String4 i. m- H& [  \3 W" Y. O) V
VARIANT_BOOL        Boolean5 i5 H! V; g, U) x
unsignedchar        Byte/ ?( v' e* M8 y
BYTE        Byte$ `9 @! ~4 d. [8 ?* O
VARIANTVariant
: w9 L. k( q# `(任何以*或**结尾的数据类型)        Long3 |; G+ R0 g! z( b4 ^: ~
/ m3 g! L. @8 S' v

; j( v$ ?3 {  C7 K3 yc中的数据类型        VB中的声明        结果
! z# {( |2 w( q- Q0 ?  t8 c0 F                   . d8 g! F7 Z2 O! N
ATOM        ByVal variable As Integer        结果为Integer 类型的表达式
* n% z' R, w9 QBOOL        ByVal variable As Boolean        结果为 Long 类型的表达式 : J- l) T# N6 K
BYTE        ByVal variable As Byte        结果为 Byte 类型的表达式 . N) |' j' u+ d, o
CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式 9 c5 ~0 g5 F- ^% T# ~/ a. e
COLORREF        ByVal variable As Long        结果为 Long 类型的表达式 % i9 Q0 ]/ d% m( \+ ]( [
DWORD        ByVal variable As Long        结果为 Long 类型的表达式 * d! m! s  w+ N- C0 w
HWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄
, P# R0 j4 v6 I% V2 }6 mINT, UINT        ByVal variable As Long        结果为 Long 类型的表达式 ) z$ W$ Z: }0 j$ ?
LONG        ByVal variable As Long        结果为 Long 类型的表达式
; ?; S) I. C0 o4 e$ U4 {& n6 @8 [0 NLPARAM        ByVal variable As Long        结果为 Long 类型的表达式
; t% T' I4 z$ a* _LPDWORD        variable As Long        结果为 Long 类型的表达式 0 n! R. a/ n! f9 o
LPINT, LPUINT        variable As Long        结果为 Long 类型的表达式 # L2 D% K0 C+ p: P1 M7 J7 G
LPRECT        variable As type        自定义类型的任意变量
$ n" S4 ~/ K& U# N5 u) iLPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式 # D: s: h9 \! s
LPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)         
7 F3 D- ]% {: F2 b$ DLPWORD        variable As Integer        结果为Integer 类型的表达式 9 a3 B7 f! m% M/ u5 y/ C  K
LRESULT        ByVal variable As Long        结果为 Long 类型的表达式
. \2 c3 f4 o# |3 v! i% _NULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式 % b' l. f0 Z3 Z3 z' c9 k  h
VOID        Sub procedure        不可用
+ y7 `& [) h9 u. S2 h+ `WORD        ByVal variable As Integer        结果为Integer 类型的表达式 7 t/ `$ O8 B1 e+ G" ^0 a6 e
WPARAM        ByVal variable As Long
. v& ?1 B/ S: i+ l& a& C- p1 ]6 p  {0 W4 p- X
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了