PLM之家PLMHome-工业软件与AI结合践行者

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:07:57

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑
) H. }+ o( `2 I9 ]
! y" K$ C4 P, M  y  B  d
0 G$ d5 {) }' k/ R. G+ X. L; H8 [以下内容转载来的 部分亲测 部分未测试
, [$ \4 A& T+ H9 m/ d% Q0 Y
1 Z4 {3 w: K% @6 V# S9 m% Q* N
5 l7 S. w8 A/ |+ U; |
VB调用C DLL时的参数传递
" W- a, r+ c7 m" G2 c% O* V( @& t
函数在C中的原型,参数类型和传递方式 对应关系   
  w" D1 @% o4 f3 j7 E6 O7 j& m$ E/ @
- y3 T6 G- D' C1 F7 c* ~9 e$ N) [$ U, T
* A% u; U) [* F/ X" {( y
C DLL 原型         VB声明                 VB调用
5 n3 j" {+ v+ W
: E% H# p* q; U: ]+ k, oUSHORT a         ByVal a as long           Call func(…,a,…)
5 L2 I1 u0 J' S( A7 G" B* Q* B% S$ v: D
int a                   ByVal a as long           Call func(…,a,…)
5 ^0 L' h* h) B# Q( J9 t. U
( x7 c- N; a2 {( @- C0 U4 Z! qlong a                ByRef a as long          Call func(…,byval a,…)3 n) b8 w& Z0 K: p7 `( q" g1 Q

& A! g5 z3 A2 w" O: R5 Gint *pa                ByRef pa as long        Call func(…,pa,…)
, j1 _& S: Q; j( n3 q
3 {: R: w6 F% D. `6 K, Rlong *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)
1 U9 ]* k6 _: `- g$ @: u
6 y) O0 G* |7 mLPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)
0 I0 x6 ^/ f) Z$ W' M) U) S- O# f- ?. f" N, U
char *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2): C) K) [% {: a! D
0 r' h% `3 v( ?  B& i2 R$ |
wchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)
% Q, G4 |) D0 o. F( F. T. J& f1 N
struct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3)
, Q2 K6 P, Y5 H5 d4 D, B
* t* s; q: Y. t3 ~HANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4)
% F5 K* t' v/ f1 B+ }' V3 ~6 p
+ F, `# E, E" Z备注  : ]+ e2 e* |1 c* V1 p8 ?; a9 L
; h$ F9 R0 z  U" D$ J* B% l, t
1)不推荐使用此方式. _, v7 j2 K- \

9 N6 J0 j8 ~: q: v& d2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50
5 w3 i- `* q& s+ c0 l( C$ Y, E) F) _
3)用户定义子类型必须用ByRef方式传递,
$ z# n& X  e$ V  K- s
: m  Z/ d; P! [+ Z3 c$ |8 h$ ]4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。
' N5 \9 W  P9 g! x+ U9 ~" a* e" N% N" G5 ^1 s

# L& n; s2 a* w& w6 G+ H! Z; C# r2 T: }$ z
3 z! }1 O- t8 ?0 o$ W( I. f9 F
+ q8 z: W' |6 f5 t9 J5 ~/ u6 Q

6 P' \2 R3 }% \4 D: F* ?3 ]! @: ^3 C8 y% |0 _/ V- F
数组传递     ! R: }0 q! _3 {) p

& F  s, k) ?( X8 Z# C        数组传递值用ByRef% L  Z6 n4 a4 z) S
$ ^" c1 y6 N) |6 y' u
        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。& C( q- h5 z& t* T
, W6 y# |2 d" L% o4 P( A; \! h

) m# z9 Y- a+ y+ C' D- q: F! W0 v/ p7 N6 T/ N- B
         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。3 i1 P+ H. e3 W

( J5 @; N# I! h7 U' \! f
0 f# L1 F2 C% ?6 b. Q% G2 ~7 p
# i  x) I0 g+ R$ q+ g
, U' m( u0 U- X& u: u6 k$ w0 P7 E. u9 {/ N9 |
dll函数直接返回字符串, F& Z9 K/ h: g# G# f& m

6 o9 S2 z2 |3 Y  D/ B, y$ M' ]: {+ r
  c+ Y: h- F% F2 I6 d
2 K- O7 M% v( M" G# C* F        VB下的字符串格式和VC中的char有些不同的/ }* X3 U- T7 c! p
: t9 E- N' q- R+ F- e. b
        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子:
9 S- j9 v# Y' j  Q' m
1 |1 Q4 Q0 G  b4 l* b' A3 Y5 `& w6 Y( H+ [: i
1 N; a! t* y$ s$ `
     EXTERN_C BSTR WINAPI RetStr() % x" s( J/ X9 W5 F) x; k( I- Y
& L2 D+ n: y3 f7 y: Y
     { % M4 a& z, ^8 \( o8 q. S: N
! B  Z9 H& @" v8 k1 H* T
             char *str = "1234567890"; ' ~- _& n/ Q$ t1 |4 m1 Y. A( a  r
; n' r9 v( _# a- f
             return SysAllocString((BSTR)str);
( A* b2 R2 H) a# R1 S& r# S9 K! @) P- J# ^5 @2 y) K
      }
3 m$ I5 r3 Q& T" I! d5 C" a, s& Q: f( j! I" F
或者参考一下VB下调用GeTComputerName的方法.
& v) y0 z: R. _3 J8 j- F( J0 K# U* A$ p8 i/ C9 ?4 ^
# H) Z& F; X. c& _8 o: |

4 X+ ^2 U. X# A; o- p  n0 u
2 U: t( B% i5 u0 l& a$ z9 i
9 I% J7 \% }% u. s- z9 i4 f! k5 v: P6 V& |  VC++与VB数据类型对应关系1 f8 `2 r7 m- b* K! B1 i
) r# U, l6 Q( o( g! s
VC++        VB
* [2 \8 r) E7 w, lshort        Integer7 _& l6 B: R! B" s% N& ^
int        Long1 Y# p* n5 W  J  h; F
long        Long
; j# U4 z9 f6 y; J2 c1 ?" BUNIT        Long4 z* A) B# u8 u. o6 M3 Y7 r* \9 j
ULONG        Long! D7 |, P0 r: {* J
WORD        DWORDLong
; D) d6 G" A4 X2 h$ EWPARAM        LPARAMLong
. l8 d$ Y$ T) b- \# GWMSG        UMSGLong. o/ R+ A; s9 K+ ~" @9 T
HRESULT        Long
" P  f3 N& |5 x: ?1 d' xBOOL        Boolean0 U: {( X! e5 p1 t. p! f
COLORREF        Long
; v! M% a5 ?1 f4 {' o' ~  S/ ^HWND,HDC,HBRUSH,HKEY,等等        Long- y6 C/ K) w7 J! N: U' o' J
LPSTR        LPCSTRString
( N" s7 b0 r6 B$ a) ~. h* _* OLPWSTR,OLECHARBSTR        String# ?4 N# n  n8 _% A/ [; M% X/ Z4 m4 s
LPTSTR        String/ A: W; j3 _3 v' L  A; ?
VARIANT_BOOL        Boolean3 H4 j% q, b! F, f4 J7 \% K
unsignedchar        Byte& i& ^4 C3 I2 V" y$ a
BYTE        Byte
' x. J- |/ j- W1 V  EVARIANTVariant
; c: U6 a; N) k& j3 m9 D* b(任何以*或**结尾的数据类型)        Long; E; A3 A" k9 D" q: {2 O7 h7 v

" k2 p5 D9 Q+ |8 M: f$ ?
: o1 _' M* @% G- ~; h3 k+ |8 Mc中的数据类型        VB中的声明        结果+ s& {5 T/ s. |# D! R
                   * f+ w8 \( N" ]' R9 T
ATOM        ByVal variable As Integer        结果为Integer 类型的表达式 ; a0 @) F: e/ _5 X
BOOL        ByVal variable As Boolean        结果为 Long 类型的表达式
( T& i- \* B. i2 |; U- i# ]BYTE        ByVal variable As Byte        结果为 Byte 类型的表达式 . p' J2 ~( }( a$ \
CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式 $ Y( Q# q) L, M0 ~/ t
COLORREF        ByVal variable As Long        结果为 Long 类型的表达式
$ R1 _$ E( s& vDWORD        ByVal variable As Long        结果为 Long 类型的表达式 % _$ V9 U! C/ M. d$ j
HWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄 5 w  T" H4 }% Y, _& R  G
INT, UINT        ByVal variable As Long        结果为 Long 类型的表达式
9 f0 Z, o8 r3 w; g: E8 K+ k" M; ]! x9 RLONG        ByVal variable As Long        结果为 Long 类型的表达式
; ?: W! R& |" ^$ B5 i* H3 q" BLPARAM        ByVal variable As Long        结果为 Long 类型的表达式
6 m7 \. M; m0 \# Z/ `& PLPDWORD        variable As Long        结果为 Long 类型的表达式 7 K; @6 F6 ^4 r$ t7 [: D' M
LPINT, LPUINT        variable As Long        结果为 Long 类型的表达式 . M  k2 @; S; ]# L( @
LPRECT        variable As type        自定义类型的任意变量
, \/ s7 C( Y! h+ KLPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式 - C, V( ]1 p: I8 N- q- D/ G3 X
LPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)         
8 W. m  o  s" O7 R, ]/ ZLPWORD        variable As Integer        结果为Integer 类型的表达式
9 k2 K' x  ~3 L: s% I, U, yLRESULT        ByVal variable As Long        结果为 Long 类型的表达式
6 Y% R$ o* G7 Q; o- g  gNULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式 $ E9 \! u' J" h( r
VOID        Sub procedure        不可用
  {* O" b# X) i, Z. [) ?9 _WORD        ByVal variable As Integer        结果为Integer 类型的表达式   }' K; X, \3 k8 H0 v* D
WPARAM        ByVal variable As Long
! f# q& `6 g5 p
" p; ]4 j. d0 c7 Q
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了