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

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

[复制链接]

2016-12-11 15:07:57 2769 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 {" q. V9 Z* w( o! s# Z3 M: ~
* }1 P& g1 k' ~" A; e% z
/ B# ?- q. f) l) P) m. E
以下内容转载来的 部分亲测 部分未测试
& L/ i5 I9 O- y" ]! H0 c
# Q- S: P0 u6 {, d' B2 K, g  f9 n" t, g& c& f4 A' ?. g
. Z4 M! n; M/ f- {
VB调用C DLL时的参数传递( K' i5 ^6 Z* `- b" a+ ]6 m" I/ O

; c2 X- k* F9 I% L6 M" m1 }函数在C中的原型,参数类型和传递方式 对应关系   / C! `: z) m& i$ b0 X7 [
9 `  R7 [7 E& e; ^

4 `9 O# ]% s* j$ t- W6 O4 [1 a! e" A2 j% O$ d; V8 F
C DLL 原型         VB声明                 VB调用7 R/ Z( j  W/ Y2 h! q

1 V* I  Y, F5 E+ o% ]USHORT a         ByVal a as long           Call func(…,a,…)
$ }- o* Y' z3 b2 M; b2 I4 |% D
. A  U7 |4 h# ]; a  Cint a                   ByVal a as long           Call func(…,a,…)
2 f1 D1 j4 A- ?- Q5 R8 k- n
7 J5 Q, B7 Z: J7 T7 b8 Along a                ByRef a as long          Call func(…,byval a,…)
! d* o. N8 G( Z3 t$ U; \  Z
1 q$ u8 |! h2 W# L7 c) ~9 J; gint *pa                ByRef pa as long        Call func(…,pa,…); \4 w6 S! s4 e2 S( |

. k$ |# y1 S6 T3 Q4 `' B; glong *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)
8 T7 y+ b; j; E; |5 A4 k% L2 D( e3 J5 G9 p  T/ _6 \1 Z/ T+ b! C
LPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)1 O2 M" f! u9 n7 a. K# o9 \0 n8 S4 J
8 q* y/ p. G& A  K$ o) T
char *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)
+ n* o9 E0 S" G3 B0 ]: i1 r# t* w9 P3 P" {" b
wchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…): H8 w8 B& r9 `; c5 j
4 ~2 d$ o4 M) ^/ A& c; ^
struct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3)
; K0 t* E5 k6 H- q
2 }' u! J3 p6 i, G7 g9 _HANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4) 1 H% k. |4 G! @$ f* a

; p, S& `" w6 S7 L* ]备注  
6 ^* }7 B- C) S! {
; b. @* d! L" {& {1)不推荐使用此方式
' }) _( c( \5 K5 R: [0 ]' ?: J5 V9 Q( D& ~; K8 ?3 V+ v3 R
2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50& S/ Z8 e# d& M

! t7 l' A  L$ p3)用户定义子类型必须用ByRef方式传递,
* ^3 |3 |; V# E* p) H; s; }& D" g! f# [2 ?5 a; |1 x& q( V1 K% X$ M9 V
4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。
7 a$ q  r& B# F. q- ]& K  a7 A  _; i
. T& H) \" I- {6 n/ u* B) S' P9 t0 l, |

8 I+ ]8 V% Z  Q) e& v4 z! p+ p- P7 f+ F3 _2 n4 l1 U) ^$ {- v8 U
' e! O8 v3 }4 ?+ N0 t/ m

( ~' o* ^* ?* u# w8 u' F4 @* G. H8 h; {' r9 o
数组传递     : W4 o! s* A& g1 T6 P- t
6 B8 J: F7 W: ]% v8 m1 L% B
        数组传递值用ByRef
6 ^5 }2 V' ~* O
- c, S* @. H2 N$ Z& f        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。8 |; c& v( Z( W! P4 L9 e

2 }, q0 H2 J( v# O
3 W2 N/ D6 j( E7 v7 x3 Z
: ]+ X( ]8 q; \" P         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。& K7 L" G6 z; V( V9 u* k, l
. L) v- @- ~7 Z7 ]; z9 r+ `. J/ n% y

7 g' D" U# V0 f: Q9 ]# w- g2 X* S' c+ O6 U* t& c
. q, ]( k) u/ @

5 V- H# H5 i0 b. W, u! y- ~9 Fdll函数直接返回字符串+ g3 n' o9 x$ J: Z! b

+ L. B- I% m+ W( H% b/ z1 e/ L, @
+ ]" K( a% E$ D: ^) E7 P6 M- {7 y1 H* c& D% U5 h0 I. a  @9 z+ J
        VB下的字符串格式和VC中的char有些不同的2 Q. y1 w' {8 x$ o. I6 @
% ]2 t1 ], D; U
        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子:
: S6 Y( ~0 X& g5 \
7 r7 h- f: x- A6 \
9 [1 _& T6 \, A# _$ R0 g3 f8 u
# O, B. X, H- ?6 D. k4 }     EXTERN_C BSTR WINAPI RetStr() 5 h: U- d/ S: a3 }% l1 J6 a

9 V/ S. E6 J0 v( d7 c0 s, [% X     {
8 M3 A" y; d9 H( d  D$ l) U2 i3 t) R. W- Y# \
             char *str = "1234567890";
3 R- u7 M1 w* e* e" Q; ?1 a1 s
: R: `: S- t1 ^2 ^. h5 `+ T             return SysAllocString((BSTR)str);
7 ~; J' E# M$ u& L3 d  V; X! ?0 d( _
+ g- H& J9 E8 Q4 p6 E; M      } 9 e! v3 m4 c0 v# r, m( P3 F8 S
4 j9 H$ z' }4 n: Y, g
或者参考一下VB下调用GeTComputerName的方法.
; E# `% ~) @* \6 n% n0 _" ^: `2 v/ f, z
1 n1 U  K$ T; }; M' u

# v+ z% Q& c/ v/ l& v
% N' l3 V$ Y& n5 A  |' p+ ]+ L- M% G  C; ~5 U1 v: R, B1 h7 N
  VC++与VB数据类型对应关系
/ H3 J( b) R% g( S5 C/ L- c" J% a1 x/ L8 t0 Q6 L" e7 K! s  C
VC++        VB
2 x7 m9 N# I1 x$ Z' fshort        Integer
% J' Z/ d: I. R/ ^5 Y0 ]int        Long
8 O0 q# t3 P+ ~7 Vlong        Long9 w$ ?% j$ @* X7 N% d
UNIT        Long
/ Y7 M8 r3 _( }* j. AULONG        Long
5 A7 H: M# O, @# U8 D5 eWORD        DWORDLong% Q% {& [' n/ N7 f& D* C2 o
WPARAM        LPARAMLong
: f  d6 @9 f8 `- e& V1 `WMSG        UMSGLong
5 K6 Y$ z- W8 ]) _6 x: s; fHRESULT        Long
9 z2 R: r. ~+ Q) d* ?( MBOOL        Boolean
1 U: C3 K. B5 z- u# u) dCOLORREF        Long
. a& B, T, P: i8 Y  {  ?" yHWND,HDC,HBRUSH,HKEY,等等        Long8 G  q* |, {- p$ ~# a0 z% K
LPSTR        LPCSTRString
: s* p2 ?0 b: h# ZLPWSTR,OLECHARBSTR        String
/ D- @5 z+ e6 K+ i' P! A- OLPTSTR        String# s# R" n& D) i- d, j
VARIANT_BOOL        Boolean
2 M8 D! Z2 u5 w7 l. Uunsignedchar        Byte
% m& H7 S, p  u% O- d/ o% Z* O+ oBYTE        Byte
6 _5 y) A! p# mVARIANTVariant5 O/ U, }7 e$ x4 f, y; S
(任何以*或**结尾的数据类型)        Long
& F. z1 q) |) \0 u% r: y3 P$ I4 [+ D9 I1 h

/ E/ B1 S% m$ M! P2 Jc中的数据类型        VB中的声明        结果% F: i% \6 F" u
                  
/ C4 I. k, K1 r& _% |4 d. Z! hATOM        ByVal variable As Integer        结果为Integer 类型的表达式 ( w- ~8 J( r. g7 W& M4 U5 {& [
BOOL        ByVal variable As Boolean        结果为 Long 类型的表达式 ; {; k' |4 ]/ I! n, O
BYTE        ByVal variable As Byte        结果为 Byte 类型的表达式 5 t* c' ^; `7 _, d$ t
CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式
9 i& N, y+ p9 ?% ]5 \COLORREF        ByVal variable As Long        结果为 Long 类型的表达式 & i: R  l( \/ e8 C$ Y2 {
DWORD        ByVal variable As Long        结果为 Long 类型的表达式 ; a( a. j. Y; m5 @$ O
HWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄
1 M8 F; @/ T4 I& [0 OINT, UINT        ByVal variable As Long        结果为 Long 类型的表达式 : q  T& p+ m: W& s3 t% |: b
LONG        ByVal variable As Long        结果为 Long 类型的表达式
# f0 B2 ~. Y0 E3 X1 T+ ]8 ^LPARAM        ByVal variable As Long        结果为 Long 类型的表达式 ( u' C2 R4 Q! j
LPDWORD        variable As Long        结果为 Long 类型的表达式
* Q4 @7 \" L8 z( fLPINT, LPUINT        variable As Long        结果为 Long 类型的表达式 " \: V3 ?2 v* M- a
LPRECT        variable As type        自定义类型的任意变量
0 `6 E) ~$ `$ O( {9 y1 TLPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式
% `* b2 r0 s# r5 Y2 `LPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)          $ |/ b9 F5 [) a
LPWORD        variable As Integer        结果为Integer 类型的表达式
2 A- g! m+ M# q0 o0 v' p; ^1 pLRESULT        ByVal variable As Long        结果为 Long 类型的表达式 3 t" Z8 Y! F2 f" z
NULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式 ) C7 |! }3 e' `7 E  K  W- M
VOID        Sub procedure        不可用 $ g/ l* d, r$ w( r2 V
WORD        ByVal variable As Integer        结果为Integer 类型的表达式
& a0 r  [3 q; YWPARAM        ByVal variable As Long$ F$ D3 r) ^/ v5 ~
, A4 g+ m& ^. _: O1 t( R! z
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了