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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:07:57

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑
, B8 m- |* L( |
. _( `1 I. J/ q# ?: k) T
# F# V  `7 q5 x$ W) i( i以下内容转载来的 部分亲测 部分未测试
. a* ~7 s, q0 a/ J7 \8 X
' V! X" Z4 r% d( T6 F
3 a2 w* ^* a( q' p# U+ _, e1 C2 E2 A1 z0 u8 Q) r( P! o  P7 W
VB调用C DLL时的参数传递6 J% |; {3 x0 Q8 C

2 T7 n2 H" A2 \函数在C中的原型,参数类型和传递方式 对应关系   5 ^( Z& N. a+ o8 |4 E
" p( C+ M8 C6 T2 G

5 c3 P8 q  q  F7 M2 E3 `/ I) u% {/ w$ T/ L$ X$ D$ b
C DLL 原型         VB声明                 VB调用7 `7 V! g  b8 L- n" `, p+ @) e
: k( B5 _% ~! P4 @8 y* H$ L6 E0 A! D
USHORT a         ByVal a as long           Call func(…,a,…)
8 c% @& |! P! T# f9 t5 t5 y
9 A! M6 ~4 m/ Q5 e# tint a                   ByVal a as long           Call func(…,a,…)( {/ ]; E( R+ D$ W8 B

! n! B" r  k, Q- p3 ^1 |long a                ByRef a as long          Call func(…,byval a,…)
: t2 T- V4 C9 F
! g0 t- ?# _6 N4 ?int *pa                ByRef pa as long        Call func(…,pa,…)& b4 K" e) V; |& M" V% x: f/ G

$ e' ~7 y) R+ e" Vlong *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1), T' M; c# Y$ H; n8 |& n

! Q9 s4 m3 g0 F% X9 X9 cLPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)
. H" V! r) |3 l# J" l7 g2 K2 q: A/ V$ b% ~! z
char *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)8 l) ?0 M1 u& o; F- O9 [" n  I
: \  D0 B2 r' S! L
wchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…). Z  `# s' c7 I; r( e# v

. R& \3 O7 t: S$ }4 U) R# }struct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3)
) ]: z3 l# W" Q- m5 c2 n$ t; f: r: o6 c- G
HANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4)
) l0 @' T- z& J* E# v0 ^4 V0 M7 [! `6 ^. Y
备注  
( q% E  M) g' `/ u* e- z* j) l* [
8 N1 O$ i9 s. P" V. x) d" N5 g1)不推荐使用此方式
; ~" H* h, I  \6 z: ~, }0 \  e8 i
8 h5 C$ I8 u2 P, b2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50
1 r6 N9 [7 `* T  r( k8 y4 ?( s' w7 |
% ^6 o1 {* p8 c3)用户定义子类型必须用ByRef方式传递,
( o3 a  y) C- E3 K9 z" b" h- J5 H( T) w& L. U
4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。   R0 _3 d7 b) O( j+ {& y/ D4 j- O

0 M1 q! ], [/ \! [( Q- k9 p3 C$ |
+ s3 I0 o) X" g3 X' V

- C  e( Q& e- ~! G: E
& Z9 |. Q- x- M9 T: P  S7 R
# N4 J8 a# j! M1 O* `! g
( o" _$ z0 `6 T( w; S数组传递     
# h$ S& f$ A0 Y% G3 r* A6 ^0 U3 f3 |2 h$ U# v# e
        数组传递值用ByRef
1 h* O0 n4 V! T1 [) r
2 n+ w7 M/ ^) m3 l- j        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。
) l  R, D7 R/ N3 A3 o
8 [2 o) X" u( y# M6 ~# C0 f/ a3 y6 B& {/ M9 Q2 N* G4 x
  M* F, |% T9 ]% B# X% ~4 d
         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
( V; G% N4 Q& v. r: e) [: \
: O( B" C5 F2 V& H" y+ w9 Z/ [8 d0 Z: S7 l8 p) w% ]
. o9 i9 B. j9 A7 M9 c
9 W7 U( ~$ _1 g' ^! p% M
8 H( W: `5 e+ L' Y- _
dll函数直接返回字符串
* N# ~6 Q/ `" \; x  N
1 R+ R3 Z5 h* L1 J4 O0 B% C5 |2 R+ u# ]) o" g
- a# X. a0 T) Y0 y5 n; r/ e4 O0 @
        VB下的字符串格式和VC中的char有些不同的
1 _2 k3 v; {% v! F4 b0 x( w7 i- Z
        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子: * w! U+ L" k0 c; D# u

3 V. ]5 Z1 G+ v* Y9 _0 u/ X
/ z$ A* ^% i8 w2 w! x+ k
) A! f2 L& U' f/ [  f/ y1 I     EXTERN_C BSTR WINAPI RetStr()
- d- h0 A- h5 u* H
2 v9 p- Q# u. g     { ) ?" L% w% P6 L" {
5 s8 L$ K- d1 Z, Q) I, E+ M
             char *str = "1234567890";
3 Y& M3 F1 `. W/ R' b
4 c% J3 H7 V# D             return SysAllocString((BSTR)str);
/ l8 w6 S4 h4 [" p3 S" M6 i0 V2 d' m
      }
3 l- }& K6 K& T" ]/ s; v0 r  A! s5 `9 [
或者参考一下VB下调用GeTComputerName的方法.; ]0 B0 q7 Z7 L7 |. L  i! P

0 P$ C: j) n2 Y. T0 C0 d, W' x* j3 q5 S  V( b6 S" j0 n; D
2 g: R- h2 ~6 F0 @/ p3 i: {

  n; z9 C! w1 y8 ?
$ N8 J0 \. ^% W( Q' l/ g" d  VC++与VB数据类型对应关系1 p* T4 N: e  P  Z) x8 @
& g3 I" n8 [' e% d
VC++        VB
6 R( K- \% E; B- sshort        Integer
7 x' {3 D% w0 ^: [7 D. g; L$ fint        Long
  z  ]- V6 [. n% V: Slong        Long
# s8 c6 D/ |- @7 }+ F; e6 dUNIT        Long
2 W  X0 B& `; Y) kULONG        Long
- r/ d& @: w# `) ?; n% v$ I' IWORD        DWORDLong$ J, C2 H8 G2 Q% u
WPARAM        LPARAMLong* G% u& [8 e( l, |2 t
WMSG        UMSGLong/ K4 {0 J, `! w8 H; J
HRESULT        Long
5 A, g' F+ P) b3 pBOOL        Boolean1 b: j! {8 [: Y1 Q$ z0 z; g
COLORREF        Long
( _, S/ X  x; A9 S! x$ ^HWND,HDC,HBRUSH,HKEY,等等        Long. _8 E" j! ]9 x6 X- D7 {- K, r
LPSTR        LPCSTRString
9 z3 R6 n2 A- ]+ XLPWSTR,OLECHARBSTR        String
5 I2 y7 o8 h" e9 H+ V$ ]& aLPTSTR        String
* _( F  z6 t! G0 e7 Z" `5 SVARIANT_BOOL        Boolean
, o+ v( Y; `- F" N$ B0 o% J/ V: aunsignedchar        Byte
' r6 S9 B! A9 @. NBYTE        Byte
& @3 ?: V: {, w& FVARIANTVariant
0 m& c! w9 F# [2 }(任何以*或**结尾的数据类型)        Long
' g: z: }6 b6 k7 ~
! w7 |6 z# m1 D) h2 O; c) H+ {2 n. Q/ z- S7 [
c中的数据类型        VB中的声明        结果5 r+ g$ E% W% s6 F5 v
                  
4 K( U8 v3 t0 @: z" P. T; {ATOM        ByVal variable As Integer        结果为Integer 类型的表达式
/ Q, G) Q3 E: M( D: {. D* v/ ^BOOL        ByVal variable As Boolean        结果为 Long 类型的表达式 ) o  C9 r/ a8 ]$ @) `9 i* h  r2 H
BYTE        ByVal variable As Byte        结果为 Byte 类型的表达式 / }: i: N- L( Z$ v7 B9 n) x8 i
CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式
# l; U6 z0 b: [( y/ A1 RCOLORREF        ByVal variable As Long        结果为 Long 类型的表达式
2 m4 r( E: \3 ]) _' @9 DDWORD        ByVal variable As Long        结果为 Long 类型的表达式
& T; j4 i: A' X* ^HWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄
- S! o5 B# |5 l$ i2 PINT, UINT        ByVal variable As Long        结果为 Long 类型的表达式
/ F' N2 c: l! l; `; [( n5 A" {LONG        ByVal variable As Long        结果为 Long 类型的表达式 & v+ N' `, K% |. K% X
LPARAM        ByVal variable As Long        结果为 Long 类型的表达式
! t8 [6 z/ K7 d( a; YLPDWORD        variable As Long        结果为 Long 类型的表达式
2 L2 J/ S* B: H, r5 F' T/ zLPINT, LPUINT        variable As Long        结果为 Long 类型的表达式 5 R% {# j4 |9 C* u" c7 [
LPRECT        variable As type        自定义类型的任意变量 ) f# u: q3 L5 W4 l0 c; W. A
LPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式 + j* F* d+ b; o
LPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)         
6 B8 g6 r& M! D% q; u% `+ SLPWORD        variable As Integer        结果为Integer 类型的表达式   D7 [! @4 o) z# {- ~
LRESULT        ByVal variable As Long        结果为 Long 类型的表达式
# F7 G3 _) w1 f9 WNULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式
' ?9 p) b, y  Q6 M3 D, BVOID        Sub procedure        不可用 6 C0 [  f+ g9 Z8 u$ Q) i
WORD        ByVal variable As Integer        结果为Integer 类型的表达式 $ Z- q/ D0 O+ x" X" |
WPARAM        ByVal variable As Long
4 w7 c- B; |" w3 Q" z) A5 j* |1 l; Z) ?7 K. w
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了