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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:07:57

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑 5 o' W$ v1 t$ ?
" Y+ i% q+ V0 I0 Z% }4 ^9 ]
% K0 r8 f6 u9 w# q  i6 ]
以下内容转载来的 部分亲测 部分未测试. _# }* L& o+ p8 q* H4 G

( x1 E/ Y0 [4 o1 m7 g: w1 H8 L3 s+ ~6 \9 |7 d# o
; r7 J5 s8 M& M/ L5 E5 C
VB调用C DLL时的参数传递
7 I! r% F" F) {7 w# C' f0 k3 B5 s: _1 J2 }
函数在C中的原型,参数类型和传递方式 对应关系   . v. U" g5 J  r. e, N
6 P; A, f1 b- e0 m# q, S/ o( U

0 B" M/ @. F/ _/ V, s8 k/ I1 D% G3 n  Z5 U3 O: P+ ]5 S
C DLL 原型         VB声明                 VB调用
1 L  c$ c6 e1 U- m# P; @; A9 S+ i( u5 k" a' D9 P' \
USHORT a         ByVal a as long           Call func(…,a,…)5 L7 K3 D, k. `# {# A& q% d+ n3 s

5 s, y7 v; X/ K- |7 `- k! Tint a                   ByVal a as long           Call func(…,a,…)
2 K6 E8 ~% j# I% m* e* Z0 c9 j) j+ R* z
long a                ByRef a as long          Call func(…,byval a,…)5 V9 r' \* h' k  @" e+ |) d3 V
8 u  J- E! E' f1 Q
int *pa                ByRef pa as long        Call func(…,pa,…)3 }1 n# [  i! o
# v. }  D) M& t4 E8 z
long *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1), u1 U  ?  C& B" n5 O
4 s3 D  L" F: a
LPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)* \" C/ X6 I3 G) A5 E
/ M0 Z. J9 T: ?
char *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)
7 L/ F4 `8 T) o* h& _% P  d
  O4 a8 A$ e  E5 ?: lwchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)
8 W+ B( @! q' r& w1 \
9 ]7 V8 S; N( a2 G0 t# G0 T6 Ostruct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3) : s& r( h6 z; t5 e. R9 Y

; V( T  E6 V# ?( d6 K" f8 e8 \HANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4)
, ~  E# Y3 J: f& s4 U) i; |$ ?) r0 J
. C% C3 r, w+ \. Y3 @. v备注  
7 c1 D0 Q8 A. Q' v' b0 N, F1 f
0 o9 N1 \; h) M" W- z7 t. t) s1)不推荐使用此方式  {) d# ]! x( n1 |# _; H' L, i
8 C% I+ i1 n$ }- R+ d2 s7 o" D$ Q
2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50; D# p) V* \% p0 X

& R: a, u: ]* U$ S! h3)用户定义子类型必须用ByRef方式传递,
' s/ s2 F  e8 e# P& `$ o/ B) r( F6 A: b
4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。
% L6 X8 S( f2 A+ \& `
2 q! P! E" o3 n. [2 f. N
5 [7 B1 F% ~2 G$ T2 r4 W1 m) z  l
' f. `8 s+ c9 A& z0 x3 G- E" O5 m, `- `5 e1 F( L2 _
2 D% m7 J4 j) c, H
+ y# w- Z. I2 |

6 u2 s3 n) @* f& F( H/ @3 t数组传递     ( Q! T. ~% P2 {* K* B

, U2 Q! J' O1 f8 k        数组传递值用ByRef+ \8 L7 x) d( R. k2 G+ y) @: w

+ G- g! f' o. {( p" r1 m        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。
9 h6 Z' S# S; J. G* P1 A$ b: _- Y+ {7 C$ T1 F& f
' p  @9 K2 @- f+ g; L* e2 H* b

: I! ?2 z8 `! e. {, w         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
* v9 w, E+ i0 ~6 i" D. a. Y: v$ Z: b* o+ \9 F$ i. m
' V+ _1 u; j. v! `
2 R& V$ e, w, M, B$ ?

7 w% p# p/ b5 w4 J( C: Z1 L' C) P! y# ^- B* ~
dll函数直接返回字符串
+ q- d1 g4 O% L9 C' @, b8 E; y0 E
0 H" g, d1 x7 Q" r( b( |- x3 q$ q: C& I) b* j

  k( |$ o8 q. A& ]* Q        VB下的字符串格式和VC中的char有些不同的1 [) w3 E2 C( a" E4 w; |
+ K# L. [9 G) u9 J8 p6 b- y
        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子: 2 p$ k! Y" S3 x3 o  ~
; s7 a% a/ e1 v3 h3 t- _

' U, ^  j$ A4 a# v7 o+ y  w; h; @5 ]& o* ?
     EXTERN_C BSTR WINAPI RetStr()
% t( r# Q1 x( Z0 j: w0 c. w
3 \( i. u; @: y     {
0 q' p: _0 X  O/ h: H; R1 {* Q2 v& {- u, n* `4 Y  C! d- Q1 g
             char *str = "1234567890";
; N) R3 B) b! A8 k4 b; o+ {2 k# F) t
             return SysAllocString((BSTR)str);* K' V8 P; p' @: M& @( r

, C" v4 l! K- f. U6 l. {7 i      }
& i. }1 [3 F7 o) x, M/ Y, y$ {/ \+ @& k; r# Z8 h
或者参考一下VB下调用GeTComputerName的方法.1 o( A% K( ^9 [" Y

9 P6 ~6 h2 l1 |8 ~
  Q2 m5 ]" N( J. i* C, Q# Z) g! J( N4 R- K  E: M. A
6 M' J! j) L' J" v& p4 }# f# }

+ o( Y$ V7 r4 \9 L7 {  VC++与VB数据类型对应关系& |0 q5 N% E+ F% T' ?

) v. ^2 R5 Y. A" L" G) j! w1 M: K% XVC++        VB
3 M* J7 O0 y, ^short        Integer% O# i! c/ f# G# a/ O
int        Long2 P" `3 J/ j) n, D- i" Y, r8 O
long        Long8 [2 X, T, j5 O+ D8 M. J* P* N! }
UNIT        Long7 Y. C' |0 n5 R
ULONG        Long% u% \1 \& b& G+ b! S" I
WORD        DWORDLong
: u* f1 H" J- O2 LWPARAM        LPARAMLong
: @( h) d% K5 i3 D/ VWMSG        UMSGLong7 z8 v  i- M3 ]
HRESULT        Long" L. M) t2 P$ ?8 N, E
BOOL        Boolean
$ [3 w, B& ?5 ~3 c. [COLORREF        Long2 Z. p, T+ s* b) R, ^" Z1 H$ U6 T, T
HWND,HDC,HBRUSH,HKEY,等等        Long
/ z/ y: U% e9 Y, m0 N8 {0 ~LPSTR        LPCSTRString
% t3 }7 g" S8 P4 b% G" K; ^* |LPWSTR,OLECHARBSTR        String
% s- x, Y9 b3 a7 E3 q$ X2 ZLPTSTR        String$ M1 g% C! E$ Y; p# s" ], ?
VARIANT_BOOL        Boolean' b) p% ]+ `' D% V0 i& b4 n  H9 M
unsignedchar        Byte
4 c/ M  @7 _5 d6 h' JBYTE        Byte* W+ ^# @  B1 _
VARIANTVariant
8 I5 j  G  M7 W7 T4 v(任何以*或**结尾的数据类型)        Long
5 s1 _9 Z- ]$ s' T- g/ D; ]0 t
% H5 r4 `6 p' B8 T& ~( C
6 w( S7 b0 V* Q# q1 m9 tc中的数据类型        VB中的声明        结果: E( U# w. A" y
                   ! t( [5 A; s- P; |3 P: @  t
ATOM        ByVal variable As Integer        结果为Integer 类型的表达式 5 w" M! y, ^- o
BOOL        ByVal variable As Boolean        结果为 Long 类型的表达式 . i* N& _* H+ m. M- v
BYTE        ByVal variable As Byte        结果为 Byte 类型的表达式 ) y; r! I: C7 u
CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式
' G+ g% {& W4 S7 B& hCOLORREF        ByVal variable As Long        结果为 Long 类型的表达式 . v. f9 |- h& w# w
DWORD        ByVal variable As Long        结果为 Long 类型的表达式 4 [2 F( G$ }0 ?1 i
HWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄
5 g; i2 T9 x5 s3 h7 ?  t; H$ hINT, UINT        ByVal variable As Long        结果为 Long 类型的表达式
+ ^! t" |6 ~$ z1 s$ Z5 VLONG        ByVal variable As Long        结果为 Long 类型的表达式 + [. B+ v1 x' _4 Q' m4 Z# \
LPARAM        ByVal variable As Long        结果为 Long 类型的表达式
9 o& z; P! S6 o: xLPDWORD        variable As Long        结果为 Long 类型的表达式 3 S% U( F+ R2 L7 m) W
LPINT, LPUINT        variable As Long        结果为 Long 类型的表达式 . Z) N' c  Y7 P/ S4 A6 b- W
LPRECT        variable As type        自定义类型的任意变量 4 Y4 b7 j) v5 o# q1 m
LPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式 - t$ I) A$ f& n9 z
LPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)          ' c. H; q, q6 a; B4 T3 S# n: G
LPWORD        variable As Integer        结果为Integer 类型的表达式 ; p" g# v7 _) U: ^. ]& a
LRESULT        ByVal variable As Long        结果为 Long 类型的表达式
( A; n/ {1 I2 V; F! B! v) W  YNULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式 ' U7 [9 Y9 J8 z' p6 S) @9 G7 e
VOID        Sub procedure        不可用
2 v' P* s: c$ K( J) Z4 n% QWORD        ByVal variable As Integer        结果为Integer 类型的表达式
5 u( x0 ?) p1 L5 g: N3 vWPARAM        ByVal variable As Long
+ H6 I+ E8 `4 q5 D  G6 f3 n5 }2 T: O  M1 ]$ g5 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二次开发专题模块培训报名开始啦

    我知道了