设为首页收藏本站

最大的系统仿真与系统优化公益交流社区

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10240|回复: 0

[求助] c++和extend的COM接口问题

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
) a5 r0 r' }. F" ~% bName = (WCHAR *) L"Poke";
/ w* j* X' f2 @) K) \. C% ]2 G  e                 4 d3 o5 m  b) @2 w
        hr = m_pDisp->GetIDsOfNames (
3 u2 D& N) s  f9 R                IID_NULL,                                // reserved
6 N% k6 F& U6 F* C, \' B                &Name,                                        // Array of names to get IDs for
4 x% R3 K8 G: m4 O; C+ T  Q5 U3 l                1,                                        // # of names in the array
/ c  W8 }6 H3 T5 x7 T# L3 L                LOCALE_SYSTEM_DEFAULT,        // System locale
) K& x* U4 Y7 @( X. X                &pokeID);                                // Array of IDs to fill on output
; S6 {% [1 X- I4 ]+ k' ?                       
6 G& Y4 P8 l  [1 N        if (hr)
/ ^* `0 ]* s0 S, Y1 [2 t% B$ @* ^5 s                {% \+ W8 z6 s5 S
                MessageBox ("Get Poke Unsuccessful");
5 v1 x# G4 O# B2 L# H                return;/ u' }, ?; `, j. p. K
                }# e/ v' l% N: p/ z  H
3 z4 x: {* |$ T) j
/**************************传递数据给extend**************************************/
( J( T6 o9 v8 s. \2 ^        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
/ ^  M/ b$ x: n  ~& z        & A# P: l6 O- x* p
        valueStr                                 = SysAllocString((WCHAR *) L"1232");: [' h, F4 o' f. q- B* H/ _
        VariantInit(&pokeVariant[0]); ) h6 C& {6 m2 r+ [
        pokeVariant[0].vt                 = VT_BSTR;
0 M% |9 X' Q; _4 V0 M! Y" f6 f$ h        pokeVariant[0].bstrVal         = valueStr;
: F5 [# |: Y, A6 V  R5 ~8 J( Y3 p' y9 v; v4 y7 X3 F/ F7 q. z5 Z
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
0 V9 F1 O- n  v6 A8 |, R# N) F5 l6 p! u8 o        VariantInit(&pokeVariant[1]); " ^- Q% Z. B  Z2 e5 H3 C, W
        pokeVariant[1].vt                 = VT_BSTR;
" F+ @, B& e& o8 ]9 W" ?8 g  \1 K8 |        pokeVariant[1].bstrVal         = itemStr;
" {5 W8 t' Q- J, J% K% F. i. P
* ^" x2 V/ t3 h          topicStr                                 = SysAllocString((WCHAR *) L"system");; c* X; z) t7 H: s" w
        VariantInit(&pokeVariant[2]); 7 X' u. \7 f  y; @7 x6 k
        pokeVariant[2].vt                 = VT_BSTR;
7 N- |2 N; g. _1 L        pokeVariant[2].bstrVal         = topicStr;
0 {3 i' |3 e* F% F3 a' @; F; C0 r( t5 ?. j! K( E1 Z7 D& O4 J) d
//        Set the DISPPARAMS structure that holds the variant.8 U# I0 S( f2 {# |5 U& {9 O. D4 G

, @: v) j+ @' ^3 f  S        dp.rgvarg                                         = pokeVariant;
: S9 ]  U6 O0 R- k* m' e5 q% b        dp.cArgs                                         = 3;
& \9 z2 z" I" i# K' j        dp.rgdispidNamedArgs                 = NULL;
7 }; y* z' R7 a4 J0 F2 d8 V        dp.cNamedArgs                                 = 0;" z5 G( C6 H: p) r# |

. f2 {7 I, T2 {; B//        Call IDispatch::Invoke()  a' t5 M7 W* n$ p
- A8 x1 ~& f  ~; y- j3 S
        hr = m_pDisp->Invoke(- p- R0 d2 K9 B; _  K& N7 d6 ?
                pokeID,' o6 t8 l) @: e1 J, x" ]% V
                IID_NULL,
. ^2 p, j+ n) t                LOCALE_SYSTEM_DEFAULT,
7 E6 W8 w) V' i* a                DISPATCH_METHOD,
9 T6 Z! k0 p7 k                &dp,
1 u4 B9 A2 A$ P5 f) W: i3 k0 W                NULL,
' V1 Q2 y& Y9 ?& j* {                &ei,, y* c7 o6 y: ^0 q' p
                &uiErr);
3 t  _1 q' o6 x* m! e. T/ i) o& `, j" O$ H4 E8 L7 X. Y
        SysFreeString(topicStr);; R' o7 T4 N. ~+ w6 v# G' r9 O3 p
        SysFreeString(itemStr);
. W) h0 L  A# u8 M: x/ _* t3 k) B4 B# a        SysFreeString(valueStr);
; G' ]" J. r( t' [
4 g: M/ T8 P( k( h现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
- _- P% e* F: t2 W! g# @此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????; h# k  H$ E& C4 q( C

0 ^. |% w- M+ ?# Q7 z% j, T
: T( X  C1 E5 X$ H0 B2.这是request的程序% C- ^# K& e$ p
//  Request a value from Extend
: b! i8 u6 E: {8 g" N! e& w//$ n" H5 E' r9 M5 U$ _
//        Initialize the variant that will hold the BSTR.  Set the variant's: Q5 U( b# }/ o8 O- J6 f
//        type flag to indicate the fact that this variant holds a BSTR. Place the
0 j1 Q$ s& q  n: U( d/ a+ W//        BSTR into the variant structure.
. a2 _/ @( T1 B% ?* ~1 }
$ R9 o- `3 x% g. @1 J# [2 J* b        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
/ B1 O0 z) w7 Y: X% g       
3 h! i7 x& p/ S( y' G0 r  t         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");( r4 Q' b5 @: _- `  z/ g
        VariantInit(&requestVariant[0]); # L4 U& o; t5 Z/ _% h
        requestVariant[0].vt                 = VT_BSTR;7 U. _+ ^7 x1 u. b4 q& T3 w6 N
        requestVariant[0].bstrVal         = itemStr;
4 R2 A  j6 Z1 N. [! ~1 ~& F, g
% b; N2 _$ v' r          topicStr                                         = SysAllocString((WCHAR *) L"system");
7 a0 Y/ u( t! @! k2 w# Q2 ^        VariantInit(&requestVariant[1]); 4 M* R. H$ [' H
        requestVariant[1].vt                 = VT_BSTR;; n% W+ d3 r) ]8 K9 |# O, ?
        requestVariant[1].bstrVal         = topicStr;
# e: @" L- ?$ P) d/ q& s
" K1 a; Y5 _9 O6 K" C/ {* d//        Set the DISPPARAMS structure that holds the variant.* g0 W) ^0 N; |& z
: X9 r  m( Z) S( L+ ]
        dp2.rgvarg                                         = requestVariant;/ r2 |5 l# M' g0 S$ P
        dp2.cArgs                                         = 2;. ]$ l3 D( q& z5 B
        dp2.rgdispidNamedArgs                 = NULL;3 ~" E/ H2 I+ |* n) i& s8 m
        dp2.cNamedArgs                                 = 0;
' a; ^2 i; }0 y! A& D* N. R! V. ~, l: G
        var.vt = VT_EMPTY;
* V  z4 g5 F2 s8 Q( H- J* m0 o
//        Call IDispatch::Invoke()0 S- _' M: _* C; A
' e8 z( K; K/ k, j  J- m; |
        hr = m_pDisp->Invoke(
1 z& ^% ^* }; A0 E                requestID,- k- N" k7 v& t; W2 b0 B
                IID_NULL,' O7 F/ Q8 Y" z. l8 _2 w  Z- b; h
                LOCALE_SYSTEM_DEFAULT,: {7 r# t* u. P" J) O( C1 C) e
                DISPATCH_METHOD,
, m) \2 t: p; k$ ]  s5 k# ~                &dp2,7 b' ?+ d! g4 |/ ^! D& }
                &var,
9 I4 i7 H* N2 a5 u% c: [                &ei,$ ~1 E# v+ |  x) g% A& A
                &uiErr);
% b$ O) z' e. f. n/ E/ s' ?$ D
( p# b2 [) ]: Q+ N; h        SysFreeString(topicStr);! W3 |, E+ H+ O7 ^( J7 A; }9 I
        SysFreeString(itemStr);
# @3 A' T6 r2 ]. H/ t, d9 U# \# N请问该程序是获得extend里面的哪个值?
  @* A  r7 Z7 _5 M, a如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

QQ|Archiver|手机版|SimulWay 道于仿真   

GMT+8, 2026-5-17 03:27 , Processed in 0.028960 second(s), 13 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表