PLM之家PLMHome-工业软件践行者

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

[复制链接]

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

8

主题

10

回帖

146

积分

注册会员

积分
146
QQ
发表于 2016-12-11 15:07:57 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑
/ `5 `/ ~1 S( x: B5 U
% t- Z' g9 \$ F9 m# e
9 P( x$ D. }1 c+ M以下内容转载来的 部分亲测 部分未测试
. A. z5 c' _) b. O" f& O
: A$ S% R4 f( P5 I. {! c! d8 T4 g$ N6 i4 w5 R) u9 X# c5 e# ~

0 ~2 P- r) ^& R9 ]0 |+ BVB调用C DLL时的参数传递6 y; ]' A, i2 r

, H* o- M  [6 S0 D1 O2 v+ z! J函数在C中的原型,参数类型和传递方式 对应关系     x% L: |# O: h- H
! v1 L- I* V$ o8 H7 \
& K" k* [' t2 Q0 o

  c8 _9 c! _+ l% yC DLL 原型         VB声明                 VB调用
! `, b4 K' b2 I4 y0 B0 |) d
4 t; ^# u& u; }1 w& T" Q6 GUSHORT a         ByVal a as long           Call func(…,a,…), U% Q2 f4 b' Z% j! @+ q

' V3 S' k5 j$ t7 Jint a                   ByVal a as long           Call func(…,a,…)5 z" Z/ j# e9 [9 G) Y1 `

: O% \: |' r% [) z& h! dlong a                ByRef a as long          Call func(…,byval a,…). |+ c! P- y' o( S7 E" O3 j

5 \; |( p; q9 ]int *pa                ByRef pa as long        Call func(…,pa,…)( \# G9 X7 R; u( T, j& w8 n& ^" F. s
# a/ f2 t. j( s5 ]' z
long *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)
6 C7 `* n+ X, R7 E+ }$ K: B+ {
$ Q, X" C3 O7 q: @! J' W8 e% nLPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)
( n; T7 a7 W( h$ Q6 b( e; X7 Z
2 O' L& i) i0 Z7 u" U& d# pchar *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)1 `! X" u. H1 {& Y" G
& S  j! i9 D4 @) A8 r# i
wchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)
0 z- U  z* ~- m% H6 F/ c; s- U
2 w! |7 F  u6 l7 I, u' t4 Ostruct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3) " x( s" D  I! J- S# s' g. |

2 c+ m3 K/ Y" b! A( FHANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4) 1 V4 ~/ I" v- A, h
7 h9 Z) D* c8 q5 O7 m
备注  
. V5 j2 [  Q( _- z
! v& y' ]& |) V5 [6 H3 \9 `1)不推荐使用此方式
  R3 R6 t8 ]4 ~$ D0 x- b* l8 W: }9 K% R' C1 A  g
2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50
* x6 R0 e9 S/ U" u' v% N; s5 V# v4 d/ s5 D
3)用户定义子类型必须用ByRef方式传递, ) p; v$ H0 ~- e: z5 u' y

% l, s! N2 v7 @( w4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。
2 u: s% G) a" g& n( k& ~2 w; A  n2 K9 B8 f; B; F

' ~# x& e; D7 o8 u
" t6 d) h" u* ?. U
2 g! B* ?# i3 G* W: x' g' T% T: p: T- ^) W

. u# ^8 A1 |; s& V1 b9 Y7 V! v& ?3 W% O, P
数组传递     
7 E2 V' `& @, O" [* {, [7 Z; F3 \+ J2 _# C. u! R3 I8 b- B+ _+ E( i* t
        数组传递值用ByRef
7 k3 _4 j7 M" {* b' u# b; y) Z! A9 E
; W! R* D! x% r# h/ M: W) J        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。" U/ S; J% }9 `$ o7 Q. K

& K- E* Z. t) O$ w- G9 p) l' S8 u) }4 ^# O; p2 z* x: ^1 u

, U7 L2 Q4 i$ N: Q& t         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
0 ?$ s3 i+ G# p, K
! B4 m, n2 L- z; t& S, {: V# O, G; p  U7 R6 \8 D

. n  v, O1 a4 c& u0 B8 ]3 M- I, [5 ^1 S) X" [" [9 }4 }
- B. \+ }" a! k" k+ m( f% E) L3 q* @
dll函数直接返回字符串& `! G& Q7 }* ?: h; q2 f( y: c
1 r  v& Q9 l3 ]7 W4 X

+ F# M! Q* m* O5 m
7 p, N0 W4 U: h# K        VB下的字符串格式和VC中的char有些不同的/ a, t% |! z. j0 }/ S7 Y2 u

' ^6 g# _8 a" t. n% q; E2 O        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子:
7 m" H, Q. H5 j$ M: ^" L) c& R% j7 Q( U( @- S. R/ @. h! Z
! Q. c9 I9 i# t. D% x- P
! _, }1 O4 v( L* ]7 d
     EXTERN_C BSTR WINAPI RetStr()
. I: U$ W" S3 v" E( |( o
: i6 q1 Q# v# ?7 e' d     { 3 |; ?8 u2 M8 E( U4 U' k
; s0 x1 I; H/ q3 M
             char *str = "1234567890"; 9 ^& P' x: q2 Q/ `- t4 G" l
, b/ z* @* `0 e. B( X# y
             return SysAllocString((BSTR)str);
  V* f. R! x+ m3 g0 Y8 W) ?. w) L2 P$ Y) @
      } ( u0 |7 F) t, r) i$ U7 ?/ t
) \& p/ ~* q" v0 H; }* ~! j
或者参考一下VB下调用GeTComputerName的方法.: k: C" k* V9 {  j8 b  n

9 e3 k# N0 f' P
8 y6 k' F/ n( `# b- G! K6 E# P+ w; o0 x# P4 p* p' V

  T1 {$ R) i1 g' m& ~. A9 v1 I: E5 ]) v) m
  VC++与VB数据类型对应关系
9 |' ~: @  G" X" F5 {# ]! J
. Y+ a' L# E3 P- v$ r& BVC++        VB- {/ s& Z  L! g3 |+ h
short        Integer
/ y) ~! M+ c0 V& Z5 ~0 mint        Long
; Q% R+ F5 ?% P% `! [/ ylong        Long
; v# w0 n% y( _& |& r- U* hUNIT        Long
% ?) W- I7 N4 m- q& yULONG        Long
: j; b: t- H8 D! L; \WORD        DWORDLong
0 x- T! l9 E5 |  e# V! VWPARAM        LPARAMLong$ `4 l4 k/ o3 U/ y+ z3 i
WMSG        UMSGLong: f0 ?/ P  C) o1 Y, ]3 Q
HRESULT        Long& h. C3 h: n# W
BOOL        Boolean& {& i9 n& o+ X# J
COLORREF        Long
: @3 Y* l9 H5 u/ zHWND,HDC,HBRUSH,HKEY,等等        Long3 G6 S/ b  u* E6 J) P2 ~: s- @
LPSTR        LPCSTRString
' B2 T/ b; `$ eLPWSTR,OLECHARBSTR        String  ^# i8 j4 G  U3 ~( w8 \
LPTSTR        String1 Z# S) _7 o, i* t; f+ ?
VARIANT_BOOL        Boolean
; r9 _* t% C! k, lunsignedchar        Byte/ x) R! S7 B, W+ u6 P0 q
BYTE        Byte
# o' ~) ~7 w# Y$ E/ }5 m# J: IVARIANTVariant# s1 R, C; [  {% y' z# J0 n
(任何以*或**结尾的数据类型)        Long( ]1 ?4 b: e5 F) i  b- O4 t4 f

5 ~+ ]- `* `' `+ ?) _0 a: g  r! t% {# M  i
c中的数据类型        VB中的声明        结果8 a  j! p" P' p
                  
% g/ \8 L8 q+ a- l* FATOM        ByVal variable As Integer        结果为Integer 类型的表达式 - h3 c$ B2 P2 }. h3 z9 I2 z
BOOL        ByVal variable As Boolean        结果为 Long 类型的表达式 2 ~! z: Y1 }1 i; l# }. X1 L
BYTE        ByVal variable As Byte        结果为 Byte 类型的表达式 . S) z, s7 ?, C* a
CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式 % Y+ F  {- d0 r# {) j- C
COLORREF        ByVal variable As Long        结果为 Long 类型的表达式 / F5 h* O9 E) O9 |1 k9 m
DWORD        ByVal variable As Long        结果为 Long 类型的表达式 # X+ m, I& }5 [" P* z# A+ o: o
HWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄
9 B# L: J5 m- z4 _INT, UINT        ByVal variable As Long        结果为 Long 类型的表达式
3 P) x* Y" w( K2 i& m, mLONG        ByVal variable As Long        结果为 Long 类型的表达式 ) P. K1 P& o# K0 I; N7 R
LPARAM        ByVal variable As Long        结果为 Long 类型的表达式 / U2 e8 e" x& b3 K+ q6 I
LPDWORD        variable As Long        结果为 Long 类型的表达式
5 `" e) J! @7 s# qLPINT, LPUINT        variable As Long        结果为 Long 类型的表达式 ( F5 J6 e' Y" L; D& A- R$ r
LPRECT        variable As type        自定义类型的任意变量
' g( b/ {/ N1 m' Z3 }7 u/ J" `LPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式 : O) g; h$ A1 d8 q$ m
LPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)          9 x. Y! ^* |+ p5 [" _0 [
LPWORD        variable As Integer        结果为Integer 类型的表达式
4 ?3 ?. a4 D( c0 W6 {* U+ dLRESULT        ByVal variable As Long        结果为 Long 类型的表达式
1 c% N# H5 y0 p$ f6 [% C& }2 t+ i( [NULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式 9 f. T1 Q/ j/ Y
VOID        Sub procedure        不可用 3 }) x: M( ]$ U8 R# k% y1 b
WORD        ByVal variable As Integer        结果为Integer 类型的表达式 3 Z3 Z: v) M, @0 ^
WPARAM        ByVal variable As Long
+ x, |. c1 d/ u) C& I& N( {1 c
2 F; s% |2 Z- J9 J
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 注册

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了