设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9974|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
- Z3 j8 E% t5 j1 q% W/ zName = (WCHAR *) L"Poke";
3 \. Q/ K( O$ D% \4 ~! u                 2 U  _8 Y3 n% w7 A
        hr = m_pDisp->GetIDsOfNames (
, v) m7 b3 Q5 @- f1 f4 U                IID_NULL,                                // reserved
  R: f4 L; {4 v) ~                &Name,                                        // Array of names to get IDs for7 h( N; r8 ~) ^
                1,                                        // # of names in the array
% D, Q% I7 X' R4 x9 D" `                LOCALE_SYSTEM_DEFAULT,        // System locale
3 R9 |9 v0 w: P' J                &pokeID);                                // Array of IDs to fill on output% x* u* I. O, {& h* j- R0 p' B5 F
                       
7 y# ]' N2 g& e2 V! f& x8 }" c        if (hr)
1 r' ?! f9 R) S                {
8 L- G$ r( v2 x- f2 K" l                MessageBox ("Get Poke Unsuccessful");
, f  i# E4 o6 {$ @7 u; n                return;+ z. {) I$ Q3 P9 q# \! m' H2 u4 S# j
                }
% l0 p8 O+ o! Q
" w8 l5 R; i8 C, ~" p$ f/ M/**************************传递数据给extend**************************************/4 l8 z( E$ w; P& r: W: ~
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
4 R: s  |7 [5 o2 ]       
+ @, B( y7 m0 i4 B0 d1 x2 a5 `* X/ }# X         valueStr                                 = SysAllocString((WCHAR *) L"1232");, k6 f2 x" K) w( {
        VariantInit(&pokeVariant[0]);
/ R; J# ~" Y/ U7 c        pokeVariant[0].vt                 = VT_BSTR;9 o/ q2 G* H* r% Z
        pokeVariant[0].bstrVal         = valueStr;/ ?5 b8 B5 W+ s
, x4 {; c; V# k( }
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");- ^2 ^7 c- C, f+ u
        VariantInit(&pokeVariant[1]);
2 s0 U3 K/ A4 B# b( b        pokeVariant[1].vt                 = VT_BSTR;
9 I8 X" `& V1 H! f& H1 s4 o0 E+ ^        pokeVariant[1].bstrVal         = itemStr;3 I- z5 p1 g% \) x+ n) ~0 o1 }
* k! e* y) i; Z
          topicStr                                 = SysAllocString((WCHAR *) L"system");
1 d) f$ i' m0 e: s        VariantInit(&pokeVariant[2]);
, q8 i/ u' _* _( Q0 a6 L$ n; Z        pokeVariant[2].vt                 = VT_BSTR;
' D5 b0 K& I( D: P! A+ ~        pokeVariant[2].bstrVal         = topicStr;9 [2 M  K. T2 R2 ]& S

% g" Z9 p# U0 \9 ^9 w2 M; D//        Set the DISPPARAMS structure that holds the variant.
9 o1 ]! y5 _- r# N$ U, G. X
! @' _2 Q& \* O" J$ W5 }        dp.rgvarg                                         = pokeVariant;
# m8 @; D: b: @" c        dp.cArgs                                         = 3;
9 J( B6 R! e/ w2 i6 ~6 o        dp.rgdispidNamedArgs                 = NULL;
- f' Q# C4 [8 n8 Z  b        dp.cNamedArgs                                 = 0;, W- Y, H0 j! m

0 y8 g( c! L. f3 u8 ^* a9 S! F; W8 F//        Call IDispatch::Invoke()5 F/ h! l: v; w
$ }7 w  n9 ?, ?) x& G
        hr = m_pDisp->Invoke(4 o, P  g) w; G4 C
                pokeID,
5 N( Z& T- J% c3 f; M0 B, Y                IID_NULL,
3 I3 _- d3 l9 h+ W1 W7 b) w                LOCALE_SYSTEM_DEFAULT,
. @4 u( N6 @( I& N! s                DISPATCH_METHOD,
8 J8 ^, j! }# {9 u; i; J                &dp,
) c. L2 H3 T- i, u  f* K1 [  Y                NULL,6 `. n1 T7 }; u, u  v# x* ~; h" I
                &ei,9 ?6 e" G- j  A- R8 B
                &uiErr);2 A; y8 k$ ?( E2 O

* |2 o$ c8 b' l4 R* ^9 R4 \        SysFreeString(topicStr);' f" s# K; Y4 X" w: l8 w; a1 P
        SysFreeString(itemStr);: k% @9 B& |7 {1 i. z  V  F" b" W
        SysFreeString(valueStr);
' y" \1 y% h- f6 y+ C1 [" n, Z1 K& m# J) a5 f# i, A
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???& U  o7 T" X' i; B: Q2 l
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
# d. n# Y2 n1 S& x& B. V9 O  b7 E+ B0 E7 k2 r8 ^3 h4 k4 S

$ I5 `: ]$ X6 d2 n2.这是request的程序* q- `7 K& P# r: A; c
//  Request a value from Extend
4 H/ g( m4 R% j3 d; \* J: R//' s. @& [! w/ q$ `
//        Initialize the variant that will hold the BSTR.  Set the variant's
* Y$ C6 i: N6 t' y! V//        type flag to indicate the fact that this variant holds a BSTR. Place the" i, A1 `* T3 y$ f- X+ D8 m
//        BSTR into the variant structure.
* W. o( v+ c: b9 T; Z8 t6 a+ Y, N0 ]- K9 d
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);& q1 [9 B/ Q0 o4 z6 ^  V
        + r. Y  b# u& X1 N! g
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");9 A, h* l* }3 B$ I! j
        VariantInit(&requestVariant[0]);
# i) G- a$ z8 W  }4 |$ a1 s# O( i        requestVariant[0].vt                 = VT_BSTR;. X' D. Q# X/ D3 [) ~6 F
        requestVariant[0].bstrVal         = itemStr;
) g6 z9 z7 {$ A  w; a
# D! `- j2 T+ s% R          topicStr                                         = SysAllocString((WCHAR *) L"system");
/ O; [! L& Z7 _1 I: n2 h- N/ v& t        VariantInit(&requestVariant[1]); $ F% ?( O* M4 T, I& C" W/ e  t! z& F
        requestVariant[1].vt                 = VT_BSTR;0 d0 P9 z( Q2 z
        requestVariant[1].bstrVal         = topicStr;' M8 {7 j! {) v; h

* _$ S1 i. P" _6 U$ G//        Set the DISPPARAMS structure that holds the variant.
9 b5 ]- x7 }$ J" m( e7 o
- ?; e* n' [$ S8 W        dp2.rgvarg                                         = requestVariant;
7 M! O$ Z: S9 \# X! c$ |3 P        dp2.cArgs                                         = 2;' W9 D7 S9 C( l% a& g
        dp2.rgdispidNamedArgs                 = NULL;+ J2 R+ [) S9 w7 t$ v* n1 i( u: H
        dp2.cNamedArgs                                 = 0;
/ F' h* b8 B5 r" d- Q8 H7 }7 u; @7 B3 Z& G
        var.vt = VT_EMPTY;- P' i( n3 [* G* x, _
) h8 t( E  Y8 f& _5 w
//        Call IDispatch::Invoke()
  ~, c+ c/ e3 T* j: x' x( C$ ]) C, }8 R; g9 l
        hr = m_pDisp->Invoke(
7 Q/ R1 _& [9 T. U& I5 J, b" T                requestID,4 p; @* A. n% ?4 ^' K
                IID_NULL,
: W8 [, h4 U: j% R  ^                LOCALE_SYSTEM_DEFAULT,
0 h4 L$ A/ z4 c/ ?* \  \                DISPATCH_METHOD,# z& F- u* r4 x5 _5 {  U& s2 m
                &dp2,' u% }; e; e7 {/ T
                &var,
8 }6 d0 j3 Y0 |8 A                &ei,  m# S& a6 X' V) H  W" y, J3 ~8 p. K
                &uiErr);+ ]' ]& o3 ]) S) _- y6 K& u7 G
: w* X; Y7 ^' F" t8 I" D1 ^
        SysFreeString(topicStr);1 g$ m  W# i. s2 [! p2 P
        SysFreeString(itemStr);
  P7 }. _) h2 ?4 W# x. I请问该程序是获得extend里面的哪个值?# F& `) H; m: m, B4 a1 d
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-5-7 09:33 , Processed in 0.017111 second(s), 13 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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