PLM之家精品课程培训,联系电话:18301858168 QQ: 939801026

  • NX二次开培训

    NX二次开培训

    适合初级入门或想深入了解二次开发的工程师,本培训结合ufun,NXOpen C++,大量的实例及官方内部的开发技术对于老鸟也值得借鉴!.

    NX CAM二次开发培训报名 NX二次开发基础培训报名
  • PLM之家Catia CAA二次开发培训

    Catia二次开发培训

    Catia二次开发的市场大,这方面开发人才少,难度大。所以只要你掌握了开发,那么潜力巨大,随着时间的积累,你必将有所用武之地!

  • PLM之Teamcenter最佳学习方案

    Teamcenter培训

    用户应用基础培训,管理员基础培训,管理员高级培训,二次开发培训应有尽有,只要你感兴趣肯学习,专业多年经验大师级打造!

  • PLM之Tecnomatix制造领域培训

    Tecnomatix培训

    想了解制造领域数字化吗?想了解工厂,生产线设计吗?数字化双胞胎,工业4.0吗?我们的课程虚位以待!

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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:07:57

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

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

x
本帖最后由 15757753770 于 2016-12-11 15:09 编辑 * d% r5 P& \1 A/ H; b) M
( v5 r# A; q+ W# M% s: F

2 Y- E9 y/ s' w$ c以下内容转载来的 部分亲测 部分未测试' I9 m/ g0 Q  \% l3 M

& k6 }& r  v# ?5 d! r
  K3 ^& m$ r/ v8 j
' L$ _9 L9 a4 s  |  R1 R0 j- ?VB调用C DLL时的参数传递
1 ~3 d- F3 O( G2 w* o$ D
4 Y0 y8 M: G% P4 ^3 [函数在C中的原型,参数类型和传递方式 对应关系   . s+ g# d% l& T% c8 g" O

8 ^. A7 x2 \+ I3 @. D! H2 D) ^0 T/ o: }/ R8 Y; J8 A# Q2 b

% d% m  u/ ^" v5 {C DLL 原型         VB声明                 VB调用
; m3 O9 A3 g& ^: c+ |
9 }. g; D( s4 FUSHORT a         ByVal a as long           Call func(…,a,…)
# p9 f4 a+ j5 O
. o$ \1 c! I" t9 r/ lint a                   ByVal a as long           Call func(…,a,…)
: f$ ~: }. J* ^0 R0 {1 b7 X; Y1 y6 \# n3 I3 u1 T, e" ?1 b. V: B5 f
long a                ByRef a as long          Call func(…,byval a,…)" ?2 o0 _* m* u* {

6 f6 |1 f! y5 X$ ], i# Cint *pa                ByRef pa as long        Call func(…,pa,…)
0 E, \4 H8 B; l$ ^$ \& O
: l- ]' c# k0 p- klong *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)
  ^; D) h0 o+ s. Y9 F7 c6 ~& l
, P0 W% |# ]5 h1 h" [2 zLPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)
( t% V" Y" W' i+ C4 _, X
6 L5 W! e, E6 ^% h' _! T/ o$ R7 Qchar *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)5 t" s( E" F$ y7 R" ]
. L6 ]0 H8 m9 n8 F7 i0 m% P
wchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)$ d) L7 A  M0 g% b8 t- E
' H/ G7 j" r" u
struct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3)
! v: {7 y8 r& m$ h0 a( m! I4 @1 e6 }
HANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4)
, H* U# a% B% W0 G) j
7 t: i, S2 y2 o3 [8 F备注  
/ L, M5 C" G8 @6 e% {
$ E# q$ \+ f/ u$ z2 N8 s1)不推荐使用此方式' I$ n1 q  {9 s

# Z  L; S# R( W/ c3 ^+ v. s2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50. ~" J7 X: N0 Z& e4 S

6 I( J  P" J8 Q% [3)用户定义子类型必须用ByRef方式传递,
6 n& p7 `% @: m6 w9 p$ {) f, P% I2 I6 D
4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。
( w- M8 P2 ]/ j2 l! C" L0 t6 V: S8 k0 `) \( ]  t
' B3 ~6 M* b5 b  O7 P
7 v, [# ?' x) T! R0 f/ [
2 }7 L% ]8 V2 Z" ~0 P) m. p

: ]& S+ `8 X  F, p
& _! n; |. o  }/ M9 Y/ u* x$ D6 x' x
# K" }& `3 c3 O  l; H数组传递     
6 B( ?( W  m' l# ^1 `) b. H
. P) Q: ]' E8 K" c        数组传递值用ByRef4 q) g8 Z7 D( H+ u
2 J, c4 k  o0 _9 w) {6 o8 k
        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。
5 K+ u: L# i& }. D9 Q1 V" b9 \, _& ~3 m1 Y/ P: k
. V) T# u) c; u" e" ~0 d4 J
( }: `* O2 L7 W# l# D8 ^
         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。
$ S& M6 {9 j$ m# j3 u" j; F" q% ^2 H( P: m
6 e! U! z  A) q) y

( w' C) a' ?, d5 J. Q
- k) m. b# \7 X$ B7 ^7 q" Y: w7 l9 _8 x# S1 h
dll函数直接返回字符串# ^! n3 ~/ r+ k

( a+ E$ C- k- ?$ ]" y) T# o5 I( D
( U8 B; N) G2 c: P6 Z7 b* E; Z7 e8 {
        VB下的字符串格式和VC中的char有些不同的
+ F1 e1 O0 P' L+ N& _/ O9 p. p! Q8 n. j# ]1 R
        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子:
$ E! Z# N; s; L: }  z2 N" F
# U( p4 E4 ^9 q  |
7 }  |2 @/ v% y  O4 g9 u& e3 F5 ~6 A
! l3 B" J+ a2 J* N     EXTERN_C BSTR WINAPI RetStr() ; b7 c2 L$ O! B0 |' e) Y6 b3 z& ]

9 q7 C. C3 |7 [3 M  F     { # ]  S3 `; d3 w. F9 U& f7 H( H

$ P1 Z  O1 h& U             char *str = "1234567890";
9 O) {( F+ g( L8 U+ v7 I9 j) R4 E3 D5 l7 W, u( g% Q
             return SysAllocString((BSTR)str);
4 w+ f* ?7 g) b# x- ]$ |( }6 H" j8 g
      } : o! E. V- e0 J) Z, b; g
+ q2 n4 Q3 S: s0 h, D0 ~
或者参考一下VB下调用GeTComputerName的方法.. d& c) h7 M0 i! F+ `" u$ E
. M) G5 H: D; s. e

) N2 {* ?+ ^8 ~3 l: [7 }6 ^; A0 R9 O; ^7 M& F' S& j/ d

- M1 f# q% U, S; `0 G; {5 Q7 {/ e! ~5 C5 B. }% h3 M
  VC++与VB数据类型对应关系* t# C" G$ h( R0 |- O+ T
. T/ ]8 h& e. P# C/ g
VC++        VB- X, J& A( |5 V8 W4 {8 y& V0 w
short        Integer! R/ V% w( i# o; X! O5 d. b+ ]$ A; A0 t4 E
int        Long# {( ?* w, @( T1 o5 h( q% N5 u) p5 \, _
long        Long* n( X1 l. A- A$ X! s
UNIT        Long
! c7 Q! E9 T& B# WULONG        Long
3 p' E  T( a1 T" W+ ]4 m' ?" k4 RWORD        DWORDLong
; n3 o+ T" k: ]. uWPARAM        LPARAMLong
: B& ~$ r- @0 H- q2 ]WMSG        UMSGLong) d/ ^1 {1 {# N7 d/ @8 V( v) z) T' `
HRESULT        Long) n2 W! m9 z$ u" M$ |
BOOL        Boolean9 s, E, y" Y6 |5 E% P! F+ b' w4 E
COLORREF        Long
* F2 Y4 S$ a9 [4 s0 @3 V* N8 G4 OHWND,HDC,HBRUSH,HKEY,等等        Long( U* u5 m2 m* z9 Y8 @3 X6 \- Z
LPSTR        LPCSTRString
3 F/ H4 h% ?# R7 {' hLPWSTR,OLECHARBSTR        String
0 p5 V% e1 ]5 n% x' PLPTSTR        String
. }' P  q/ J" r6 g. ^( PVARIANT_BOOL        Boolean% I1 V  C( f* d3 M( y* m
unsignedchar        Byte
( q2 m6 \" m* `/ X: I; ZBYTE        Byte. F* Z+ p2 z$ E0 r6 S. {" n7 V0 s
VARIANTVariant* D; U+ {2 g5 L6 f* R
(任何以*或**结尾的数据类型)        Long3 o( Z7 N7 p6 M3 E

$ m; J8 ]. B. ]4 B' @* Q
* [; c. Y, S( x" j! L# P# r$ |c中的数据类型        VB中的声明        结果) c7 w  E4 F) w
                   % a% P# a+ I- r. O' |
ATOM        ByVal variable As Integer        结果为Integer 类型的表达式
6 z! a3 n* D+ D+ b9 T1 QBOOL        ByVal variable As Boolean        结果为 Long 类型的表达式
  a$ d$ K$ e, C* k9 W( kBYTE        ByVal variable As Byte        结果为 Byte 类型的表达式 ! e* G6 J& P2 t9 s: b
CHAR        ByVal variable As Byte        结果为 Byte 类型的表达式 : h3 ^6 y' C/ o; N: U9 [8 I; G
COLORREF        ByVal variable As Long        结果为 Long 类型的表达式 $ g. A( x, D# W$ M1 q" I9 W* y
DWORD        ByVal variable As Long        结果为 Long 类型的表达式 9 Q$ e- J  \$ N  ?2 ^( p( ]. [
HWND, HDC, HMENU        ByVal variable As Long        结果为 Long 类型的表达式等Windows 句柄
4 j2 G: C0 z( qINT, UINT        ByVal variable As Long        结果为 Long 类型的表达式
7 |! x0 @& e4 v. nLONG        ByVal variable As Long        结果为 Long 类型的表达式 $ |" a7 G+ Y  g  ?1 R9 Z) C
LPARAM        ByVal variable As Long        结果为 Long 类型的表达式 & b( e( m; Z/ L! X1 I6 z
LPDWORD        variable As Long        结果为 Long 类型的表达式
8 R! J, G; Z( ^" X9 E7 [5 tLPINT, LPUINT        variable As Long        结果为 Long 类型的表达式
- y/ r$ u" s% T. hLPRECT        variable As type        自定义类型的任意变量 3 P, d$ |" F/ d2 }3 m4 q! t, I  g
LPSTR, LPCSTR        ByVal variable As String        结果为 String 类型的表达式
* Y9 M- Y$ I" `% y4 iLPVOID        variable As Any 任何变量(在传递字符串的时候使用ByVal)         
% u/ b- X/ x0 M' v* K( Z* LLPWORD        variable As Integer        结果为Integer 类型的表达式   _: V4 y% E$ J+ v& X3 e
LRESULT        ByVal variable As Long        结果为 Long 类型的表达式 " S# ?/ S8 g1 @- F0 g
NULL        As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer        结果为Integer 类型的表达式 - }, V! c9 C2 v4 @5 m6 i
VOID        Sub procedure        不可用 ) t( U, I1 H( K9 _% m
WORD        ByVal variable As Integer        结果为Integer 类型的表达式 # Q( ^" {/ @/ R6 S6 z+ \
WPARAM        ByVal variable As Long+ y7 j! `% y; X* v& K* u

+ ^4 O. s/ y6 w5 |
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了