设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10689|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:' \1 a6 C; I3 q2 t
Name = (WCHAR *) L"Poke";
, L3 h  d2 h# t8 [& [; J                 ; s' Q0 J) m4 A/ n* m
        hr = m_pDisp->GetIDsOfNames (2 j" x$ |. r% E: T3 a4 U. R
                IID_NULL,                                // reserved7 X, ^: ]  i; x7 c
                &Name,                                        // Array of names to get IDs for& n+ r, P2 u+ X, V0 r
                1,                                        // # of names in the array9 \, B7 Q4 i: W: b, H
                LOCALE_SYSTEM_DEFAULT,        // System locale
0 x6 p% o% b0 n2 v+ W8 |                &pokeID);                                // Array of IDs to fill on output& I; w/ u+ p: n2 ]7 U
                       
7 X5 w9 o# r: L: e1 u4 |6 k        if (hr): s6 p* \4 t- \; p- d$ n6 H
                {5 s# T4 J% \* Y0 P8 t
                MessageBox ("Get Poke Unsuccessful");
6 V% n! b  ^! q, U+ V' c                return;
7 J8 X* \7 W" j' N: H9 B; Y                }6 _: L" [/ h3 s) @, n
! U$ F/ J$ e) r6 C* ?6 ?
/**************************传递数据给extend**************************************/9 s+ Z5 p% G& w# g0 F8 w& g
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);, E* @% }8 L# ]8 h, ?
       
7 L7 v* o2 u. L6 g7 S0 ~& S         valueStr                                 = SysAllocString((WCHAR *) L"1232");
5 v% L" _+ ~+ N) Q- y        VariantInit(&pokeVariant[0]);
( c" H: e$ B& `" \- C, m        pokeVariant[0].vt                 = VT_BSTR;
& g$ I/ c* @# k4 V( b        pokeVariant[0].bstrVal         = valueStr;' \  z: B, \! A5 j+ q% }1 H

  B0 |6 F- }. k0 Q         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");! p4 @! u+ F6 {- W
        VariantInit(&pokeVariant[1]);
) ?4 M6 A' j3 o/ ^7 X6 B' K        pokeVariant[1].vt                 = VT_BSTR;
' t$ c( p% c' `: h& i        pokeVariant[1].bstrVal         = itemStr;) d: V% z. F8 Y2 Z
# `* v: T9 ]& Q- h+ a* \' ?
          topicStr                                 = SysAllocString((WCHAR *) L"system");
7 e- m% g5 ?& ?2 F# Q        VariantInit(&pokeVariant[2]);
+ d  d8 ]& u. m; q* O! g+ g, c        pokeVariant[2].vt                 = VT_BSTR;
: G% L; E% W, _& N        pokeVariant[2].bstrVal         = topicStr;3 C, M% z" M& ~) Q; [
0 D+ F2 D1 }. `2 n7 a
//        Set the DISPPARAMS structure that holds the variant.. o0 m+ c8 U+ T7 s# U4 {% B! ~
: D8 b; a. }6 a6 W' F- u
        dp.rgvarg                                         = pokeVariant;
- H" {, _/ R2 S- o- w4 X3 ]: D9 g        dp.cArgs                                         = 3;
% f3 f! c0 B4 l" a" V        dp.rgdispidNamedArgs                 = NULL;& `( v8 Z4 [4 M
        dp.cNamedArgs                                 = 0;
& Y- g7 r. }, \! y  k
# I4 c9 q9 q8 P, b$ x; h5 ]" P! T//        Call IDispatch::Invoke()
& k: |" I4 S/ O" _1 k) ?# {  B  f" i2 z, a
        hr = m_pDisp->Invoke(
! V! ?: B" y: k1 ~/ |- }$ O                pokeID,
5 W. Q7 T# U! V+ X  m( G! ]                IID_NULL,  w# @0 P/ G  f/ W% w3 `8 h
                LOCALE_SYSTEM_DEFAULT,; p" g$ ?8 C5 W1 U* x7 h
                DISPATCH_METHOD,
; J$ m& `0 n* i& ]- ^                &dp,
7 ?9 [5 C8 k1 ~2 A                NULL,) z5 |4 k6 j" `: _) q
                &ei,0 `6 ?0 S5 q8 F: d
                &uiErr);
1 j* m* @& V* ~' r7 C7 r8 s' I! b) L, g2 H
        SysFreeString(topicStr);/ r# z/ b: K& ~
        SysFreeString(itemStr);7 f' R: \5 h$ |' K- X1 T
        SysFreeString(valueStr);) O; W2 Q8 v3 U: [: E1 ^' A

& _, M" N& h9 P  B现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???. P9 i  ^1 X1 m4 g
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
$ @- M  d2 p0 [$ X0 U
5 u4 s7 F% y3 v) Y9 O; U
3 I1 P% D( e& |9 F0 R3 Y; m2.这是request的程序
; m( A; S/ z* n" h5 L1 i' Y//  Request a value from Extend# A0 p/ n5 M' Y
//( r0 j7 s& t7 n4 w
//        Initialize the variant that will hold the BSTR.  Set the variant's
: G2 R7 J3 E9 C6 v//        type flag to indicate the fact that this variant holds a BSTR. Place the
( D  B5 Y# b& U8 _//        BSTR into the variant structure.
  O. H- l" |  ?: s
& a0 R! E) I: ?8 \9 G        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);$ _, e, G/ i' q
        7 E% K- d) K+ r0 L$ g2 r& B
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
  W, U, i+ K; z/ w' u        VariantInit(&requestVariant[0]);
8 _. e$ A% z2 ^) @% d' @6 L        requestVariant[0].vt                 = VT_BSTR;
8 J3 N# n- D/ U0 m$ V  T4 c% C8 p        requestVariant[0].bstrVal         = itemStr;
  ~$ ^' Y; P1 s* j- u1 I; n
2 i0 x  ~! ~" N          topicStr                                         = SysAllocString((WCHAR *) L"system");
8 C+ S; b) y4 z6 I        VariantInit(&requestVariant[1]);
3 s4 k0 e$ N- [3 k* ]        requestVariant[1].vt                 = VT_BSTR;( f% R7 `4 y0 R1 H9 ^9 O" i, S0 \* O
        requestVariant[1].bstrVal         = topicStr;# I8 g1 }. @( X  D6 F: f: |' o
7 r$ ~# f0 V, Y4 G
//        Set the DISPPARAMS structure that holds the variant.
5 a& K7 S7 m2 M, Z) e$ t- h8 o+ I( I
        dp2.rgvarg                                         = requestVariant;
% K0 g0 r3 q; B( w+ q% _7 b7 t        dp2.cArgs                                         = 2;
$ P6 u/ h6 ~/ i) A% B        dp2.rgdispidNamedArgs                 = NULL;4 D8 F; g4 P8 a* X
        dp2.cNamedArgs                                 = 0;; w1 j" f7 w0 |3 X* Y1 d, v
7 ?7 ]! K) S  ?. O6 j
        var.vt = VT_EMPTY;# @% C8 g* p3 m/ D- X% y+ P

/ F2 z) b% q! f( e3 m+ g7 g' l7 D//        Call IDispatch::Invoke()
8 h  \$ u% Y2 H- R, d+ J& @+ ~: j0 L% I1 D& N. {, t* u$ ~
        hr = m_pDisp->Invoke(. ~5 i- N6 P: c% s# _: e/ A! C
                requestID,
( t% K7 G* Y2 W5 J) l                IID_NULL,! R6 Y; s5 E' U& b1 @6 m! W
                LOCALE_SYSTEM_DEFAULT,2 N& n" L; _7 r5 \
                DISPATCH_METHOD,
/ q. Q# L3 m- T+ B1 l                &dp2,
3 _/ \1 [2 d1 M& O% h0 r5 |                &var,. ~2 l6 U+ W; v; D# n& k
                &ei,1 ?' _; H' Q: t3 k- k/ e
                &uiErr);7 l; _- q1 g& s2 W6 g9 d

/ ?* Q3 |* Y: k/ ^0 [        SysFreeString(topicStr);
8 J7 l( J8 b3 h7 U: W$ j7 z# r        SysFreeString(itemStr);& F: e9 Q* Y" E; Q& ?1 \, L1 p2 G
请问该程序是获得extend里面的哪个值?8 U* ^- i+ ~2 G5 [, r! d
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-6-7 14:36 , Processed in 0.013111 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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