设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10043|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:! V' h: I' R. a3 p7 U
Name = (WCHAR *) L"Poke";0 j# k$ k* b" |6 ?2 K( L  c7 e
                   n- }/ M- O2 O, ^8 i/ y# H9 C
        hr = m_pDisp->GetIDsOfNames ($ ]. T( e4 I. `, V7 ^, L/ q( V
                IID_NULL,                                // reserved0 _# y& H/ E0 Q# E& k* Z
                &Name,                                        // Array of names to get IDs for" K: C* y, r# [- Z  i1 `
                1,                                        // # of names in the array  Z; n. [' d. b7 K  Y6 d8 E% F  {
                LOCALE_SYSTEM_DEFAULT,        // System locale) B  g' X, t: B
                &pokeID);                                // Array of IDs to fill on output5 j* c7 w) @) ^$ T9 k; X% y
                          W; a7 Y2 b; g
        if (hr)
" j' M( S5 v7 z2 j                {
# ~9 F% a# p4 ^' k7 y                MessageBox ("Get Poke Unsuccessful");
6 w, ]2 Q* {+ u" t4 K                return;9 C" c$ e, I4 O+ m6 @
                }4 X2 G% L6 v( z$ E$ [5 D7 _

. a" a1 F+ i6 x9 K. e2 y/**************************传递数据给extend**************************************/4 ~- X3 s6 C4 x( R& Q+ t0 E# x6 J
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
5 ~3 `1 W$ h% t6 @: L7 i        + o: J( _5 F6 m) X2 C3 x
        valueStr                                 = SysAllocString((WCHAR *) L"1232");* U" `, v/ w8 t" S- T3 Q( |2 p
        VariantInit(&pokeVariant[0]);
4 _% o. \# Z& w2 N$ D: J+ _- `        pokeVariant[0].vt                 = VT_BSTR;/ N" d% j4 y- b. U1 U, c2 x0 C$ O
        pokeVariant[0].bstrVal         = valueStr;, V. C' Z" d9 m7 p( L

4 d( A: Y/ F' N( V2 c2 J         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");- |  @$ I  B( b( m! e  K1 s
        VariantInit(&pokeVariant[1]);
$ t1 [# p! D* w5 S2 [2 }        pokeVariant[1].vt                 = VT_BSTR;
$ D' |3 y% A/ \! |        pokeVariant[1].bstrVal         = itemStr;
4 U. |# e- l) j1 ~% f# P6 t1 y" I
5 @! M$ _6 p- E6 Z# K% v) K) k          topicStr                                 = SysAllocString((WCHAR *) L"system");
3 z* f1 X  ^  ?5 V( S! ^& h        VariantInit(&pokeVariant[2]); 4 o' K/ r* y" q* ]+ {
        pokeVariant[2].vt                 = VT_BSTR;% d# a+ [! I8 ]5 `1 N
        pokeVariant[2].bstrVal         = topicStr;
' K+ f& F1 a4 x1 t. O
+ \- k4 t' V' @( Q% O: L//        Set the DISPPARAMS structure that holds the variant.
  P+ s4 T5 V/ K% p1 D- @
2 q) x/ a, F/ J        dp.rgvarg                                         = pokeVariant;* @. ]. }: V$ A/ v: V! g
        dp.cArgs                                         = 3;3 s  K: G, J# J+ c
        dp.rgdispidNamedArgs                 = NULL;
1 h, Y7 a+ Z7 z8 q: C/ l) L7 I        dp.cNamedArgs                                 = 0;) Z2 W$ G  e6 f) k5 {

) t- k; p+ n, o$ n//        Call IDispatch::Invoke()
! j  @; r4 ]5 D2 x4 Q* P0 v4 _
0 t% @4 b1 F$ T" B& ~3 T        hr = m_pDisp->Invoke(; F% d% l* V4 C; [
                pokeID,8 B; M! ?6 c5 @. J
                IID_NULL,
, E+ O4 K- d2 T- f8 L# h                LOCALE_SYSTEM_DEFAULT,/ D# y$ O8 P6 @; s4 M9 n8 a4 e: q
                DISPATCH_METHOD,5 m; K5 ^9 T7 Z  P$ X; }
                &dp,8 u# D" |6 L4 _( Y8 L
                NULL,. }) O( {% S  p: r
                &ei,7 N- h' c6 G& c/ J) ?' b, Q" _
                &uiErr);3 `  M' I$ M3 W7 p$ h

' Y$ [: d' f/ e  O+ E        SysFreeString(topicStr);
$ J2 x5 ]0 f8 o+ k; i0 l1 a) N        SysFreeString(itemStr);5 K( u& p& N( N
        SysFreeString(valueStr);6 E4 ?" q1 A( e, Y. [0 D2 {9 P

+ @% e) ^8 N. F: i- X现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
. w, B+ B& s( @2 D8 }  r此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????: n+ |2 n2 g  ?
6 k* g, @! a6 e4 Y) j8 u2 }
- Q9 r5 T4 L2 e8 j, o$ m
2.这是request的程序
" A$ J+ _9 `2 u  e//  Request a value from Extend
: X5 _# ?/ ]7 P# f. b//
; v7 {! _1 Z- A7 M% f//        Initialize the variant that will hold the BSTR.  Set the variant's
* j; R# |3 h! ]! J7 q1 {9 A//        type flag to indicate the fact that this variant holds a BSTR. Place the
! h# U9 W' i- r6 `" O//        BSTR into the variant structure.
1 ~* m, I4 j! x& u2 _% E% G! L, ^$ H' ?8 C
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
) S/ s! q8 f1 P$ A( x        1 m2 c5 s: B0 i( X  T+ X: S
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");' ~! M- M3 T7 a, T$ Q! Y8 `. E  u* `
        VariantInit(&requestVariant[0]);
4 _& G4 w/ e) i6 p+ ?) |        requestVariant[0].vt                 = VT_BSTR;' I8 o" x% X  D. S& A
        requestVariant[0].bstrVal         = itemStr;
) G4 Q0 J% ?# ?
& C4 L# ]6 T. b/ l; H: y, o          topicStr                                         = SysAllocString((WCHAR *) L"system");
/ G; Y1 r8 D& M9 F2 }/ u        VariantInit(&requestVariant[1]); 6 |- m3 K* `' w# `- ~
        requestVariant[1].vt                 = VT_BSTR;- T6 K- a, ]; Q' w1 S" p# J
        requestVariant[1].bstrVal         = topicStr;
; l( M9 E# x/ @1 C4 ?4 }3 x
  T* u6 n  a1 y( D//        Set the DISPPARAMS structure that holds the variant./ G5 K0 |) |" H& j0 g5 p
, P* t9 F9 Z2 w$ r8 _7 l$ s+ y+ ~
        dp2.rgvarg                                         = requestVariant;
. f& b6 N! a+ |% c* ]2 j7 W        dp2.cArgs                                         = 2;
  w. e' y6 R4 o  J8 w1 q        dp2.rgdispidNamedArgs                 = NULL;, O) i5 u6 Q$ Q1 V6 g1 y% X
        dp2.cNamedArgs                                 = 0;4 v8 s# _/ p: _
8 E) a" v. s/ P4 C) y
        var.vt = VT_EMPTY;
2 x* p' E6 x) Y3 a. @7 e' n
; ~8 Y2 T) ?; J3 Z//        Call IDispatch::Invoke()7 \! R3 ]  X0 \- j/ [, B7 f6 R
0 U" `9 \' d' e' w+ s3 n8 {
        hr = m_pDisp->Invoke(
5 s- C/ m; U  F6 k                requestID,( ^" n+ s  O3 z+ m
                IID_NULL,
/ _  D& S) C, g1 R                LOCALE_SYSTEM_DEFAULT,* T4 ]1 v/ u0 T$ D- l! @
                DISPATCH_METHOD,
0 y% X) `9 s1 c; ]  G                &dp2,
  y" {* w/ }! _2 g, S5 a                &var,1 M( W0 u9 G) |
                &ei,& f1 W3 }* U+ ]& R
                &uiErr);
/ H! i) p' }2 S+ t, G  d; d% X+ }  g* [5 S6 U9 L
        SysFreeString(topicStr);
7 S5 m/ g2 b( k4 c1 N        SysFreeString(itemStr);6 O4 ^6 Z- S  y8 f; ]4 @( h6 b
请问该程序是获得extend里面的哪个值?
% l' n% O2 y+ L6 M如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-5-10 11:37 , Processed in 0.017354 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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