设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13020|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:& {& s) t% M+ |& |+ _
Name = (WCHAR *) L"Poke";
9 V& Y0 n+ }1 j0 n2 g$ K+ j                
' m2 f3 K# g$ J        hr = m_pDisp->GetIDsOfNames (# p& Q6 S0 G" w" o4 |* \4 }$ U5 h
                IID_NULL,                                // reserved
3 G' O8 T3 v5 Z  `6 z; x                &Name,                                        // Array of names to get IDs for
( x& n5 L5 A& w! u0 l                1,                                        // # of names in the array% M' i9 C; {; a
                LOCALE_SYSTEM_DEFAULT,        // System locale
* _( Z* W# l- Z7 B2 d" g' F                &pokeID);                                // Array of IDs to fill on output& t( {" [2 n- a5 `. w" {, n
                        + k/ P4 L9 E5 C9 T, N
        if (hr)
/ W+ _: ?: e8 U" b! N                {/ q, V+ s' k2 b' f+ B, W
                MessageBox ("Get Poke Unsuccessful");
% N% N$ z0 q9 W1 Z' v  }4 J( B                return;
" S7 A$ j6 O" J0 [7 E                }
+ n. s. s: Z& [6 I5 g- X6 `
. ?$ z. |" F/ Q7 \0 I+ W/**************************传递数据给extend**************************************/
% z; @% d. c; y3 X; q+ ]2 W* l        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);/ K* P7 D/ V$ z2 E
       
0 G4 M/ O' a6 x         valueStr                                 = SysAllocString((WCHAR *) L"1232");- n) z$ n* s+ x# M1 A
        VariantInit(&pokeVariant[0]);
: B( O/ n: ?. }% Y$ D' N        pokeVariant[0].vt                 = VT_BSTR;
5 v4 [2 R7 q. ~* g; a( k        pokeVariant[0].bstrVal         = valueStr;$ G3 w. u  _) y, l9 Z

. n5 ~+ }7 O  `0 g! z  i4 Z8 ~4 p         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");' {" [# R: V" w6 |3 F
        VariantInit(&pokeVariant[1]); 1 F& R0 L, h( y% B3 G
        pokeVariant[1].vt                 = VT_BSTR;
, @+ g! Q; c, T5 O& i% B        pokeVariant[1].bstrVal         = itemStr;
" s* J# ~0 {3 a
0 A1 i6 Y, x) M7 Y) C. B          topicStr                                 = SysAllocString((WCHAR *) L"system");- K7 U+ h" b! ^9 [$ `  p/ Y7 G4 t& ]5 |. s
        VariantInit(&pokeVariant[2]); ) f" `$ Y+ ]4 b0 e" S
        pokeVariant[2].vt                 = VT_BSTR;. t& ~- Z. t5 |+ B+ S% v, H9 v
        pokeVariant[2].bstrVal         = topicStr;/ b2 d: W! @9 w0 d2 p: |" b
+ z1 x: p: }' E( j8 \
//        Set the DISPPARAMS structure that holds the variant.
, v2 ^  W5 P5 ]1 a4 g+ C: \3 f0 R- P4 ?
        dp.rgvarg                                         = pokeVariant;
/ E1 x6 p- `5 J0 t* j# N        dp.cArgs                                         = 3;
( y8 Q6 T8 B* h  ^0 M  w3 M# n        dp.rgdispidNamedArgs                 = NULL;
7 G# [/ J% U: ^        dp.cNamedArgs                                 = 0;
5 G9 f* B7 P$ ~4 K$ h5 m' B& Q5 z/ o- V4 I' ?( {3 V0 S
//        Call IDispatch::Invoke()( r* {: v1 f2 Q

: V' Z# Z# A" G9 {2 O; M1 D; Q9 b8 ?        hr = m_pDisp->Invoke(
+ p( H7 I9 L/ g$ E                pokeID,5 Q9 i/ E% v5 s! H/ }0 H
                IID_NULL,
4 Q8 d0 e4 D0 }- N+ Z                LOCALE_SYSTEM_DEFAULT,' m- s4 U8 d# S% n4 F/ x7 N1 k) w
                DISPATCH_METHOD,
- B# O3 M1 o/ s" G; j$ S% J                &dp,- w; R8 Y5 n- x2 A
                NULL,
9 y3 w) a; t( v2 e! X                &ei,
3 l! l4 }* c; F5 _2 a                &uiErr);: ?. o1 G! {  |1 V

! A- d7 f% {# M9 h1 N4 |5 @, s        SysFreeString(topicStr);
  n9 N& |- c9 ]* |/ D* Q        SysFreeString(itemStr);  a3 ]8 t# ]' v8 h0 Z6 v6 u
        SysFreeString(valueStr);
  c2 I( H7 k+ W9 a4 E, D. T4 e; s# H5 |, V4 J; ~. s6 Y( [
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???+ E" I; T# _5 B/ B; v: T2 h* S. J' x
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
$ K8 \  K/ I5 v, {# ^& y% [3 Z' X- W: e' @# h
! _/ G1 Z. Y1 v6 l2 i
2.这是request的程序3 c. B5 e  p7 ]
//  Request a value from Extend
0 o# X6 _/ v# r6 l3 z//% A- }, A8 w, x
//        Initialize the variant that will hold the BSTR.  Set the variant's
1 `8 k* \" `9 ~4 v# @) P3 x( m! \# A//        type flag to indicate the fact that this variant holds a BSTR. Place the
9 ?1 P* y2 V5 A" }/ r//        BSTR into the variant structure.
5 }( m" v5 h9 S& B9 i( h7 d9 r* s
  _5 P0 g4 \' J6 ~        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
6 V7 W& f* z" p) m        ! B! v# v  b; s) _
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");; y+ T& `( K4 W
        VariantInit(&requestVariant[0]);
* s3 i: X5 K6 Z9 E+ h        requestVariant[0].vt                 = VT_BSTR;5 F! u9 `+ v* @& e
        requestVariant[0].bstrVal         = itemStr;. e+ q" {1 C: X% V8 s; r
) R0 G% J$ c8 P9 q* b
          topicStr                                         = SysAllocString((WCHAR *) L"system");/ a% D1 |) s: V: ]5 k2 N: b
        VariantInit(&requestVariant[1]); ! w  M/ K0 A+ f/ g; ]( G. f; D/ x
        requestVariant[1].vt                 = VT_BSTR;
2 y) j: R( {2 x. K' w, |8 ~        requestVariant[1].bstrVal         = topicStr;- S% A$ i' M- g" I; u, V, x
7 V7 y/ P' m2 \7 f
//        Set the DISPPARAMS structure that holds the variant.
) n- Q/ d: I+ ~( c" o
: o( |8 p5 Q7 m4 G, p5 y        dp2.rgvarg                                         = requestVariant;
* z  e( I6 F* b* x8 F& }2 d& m        dp2.cArgs                                         = 2;
) i1 \0 u. u# ]* F        dp2.rgdispidNamedArgs                 = NULL;. O0 y6 T  F3 C: }* ]
        dp2.cNamedArgs                                 = 0;) U8 i) h  D, x2 W/ q. Q8 u

0 N1 v8 R* A* r6 L0 ?. L, I         var.vt = VT_EMPTY;2 S( C, z4 C) {, `

1 A1 K. t+ G; o. }  g//        Call IDispatch::Invoke()4 f6 C# F9 [" b; m2 y

  g9 a* u; \8 \6 O        hr = m_pDisp->Invoke(  |6 b6 F& k8 k1 h0 T
                requestID,2 B* p1 {5 @& Q$ r; X
                IID_NULL,  g# G9 f4 \" T
                LOCALE_SYSTEM_DEFAULT,
+ e  J$ n6 P4 e/ K! ]                DISPATCH_METHOD,
: G, {3 A  Q3 b                &dp2,( a, L" s9 K& X( X; ^
                &var,4 k$ Q+ _) c) s3 x; Y) C8 k' J
                &ei,
9 A3 J  D  l1 [* V                &uiErr);% |. u& O, F$ m% ]: T

3 a+ ~& I& b: u( w" y$ @        SysFreeString(topicStr);
1 T, |4 l9 b5 M        SysFreeString(itemStr);2 p0 H6 r# P! `) J# y, }0 \
请问该程序是获得extend里面的哪个值?
% J! L$ F6 N8 S" f: N: r如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-9-9 10:21 , Processed in 0.016235 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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