设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 6668|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:6 r; a- I: Z. [( ^
Name = (WCHAR *) L"Poke";& j9 \. T3 R; h9 h' g* t- q# j
                 7 y1 q6 v) W1 t  ]+ h/ X2 O8 w" ]
        hr = m_pDisp->GetIDsOfNames (4 x* l* C, C2 }( H- w# M( y, {
                IID_NULL,                                // reserved5 g4 K8 e7 s7 s
                &Name,                                        // Array of names to get IDs for1 y& W' q6 {0 x9 ^% a/ f
                1,                                        // # of names in the array
8 F& z+ _. t- |( d" E                LOCALE_SYSTEM_DEFAULT,        // System locale8 d1 p! P0 p& M# M; h! L6 V
                &pokeID);                                // Array of IDs to fill on output
  e# N3 e+ _- o" t  m                       
! ]) l5 h' X5 l" q  O        if (hr)
! |+ E; q* g1 H# Q. ]" J                {5 I4 y4 B$ i( |. D8 C$ q% y
                MessageBox ("Get Poke Unsuccessful");
6 f( u) t7 P) l1 V" q: y% T! U                return;8 s1 D5 A4 A( v
                }
* C, F" Z: I- \3 K1 r# r% w, \& }' O7 T+ Z+ l9 n! b) l
/**************************传递数据给extend**************************************/
; |, W  j0 C  `* v        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
1 h9 u& D" D3 E6 ~8 M+ r* C       
7 a) A* s& g3 n4 a& O         valueStr                                 = SysAllocString((WCHAR *) L"1232");! N( Q! d' g. T+ j  M
        VariantInit(&pokeVariant[0]); 0 K( C7 U- X5 E" g$ H8 `
        pokeVariant[0].vt                 = VT_BSTR;
2 F/ F! P+ o) l2 @, [& m8 _2 O        pokeVariant[0].bstrVal         = valueStr;
6 ^$ }3 x# d% R" t, {7 e: v
2 W! X" _. G1 R8 n         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");8 |. J9 g! V+ f' f. I6 U
        VariantInit(&pokeVariant[1]); 0 [3 U% O/ C  w6 [) Z, C9 o
        pokeVariant[1].vt                 = VT_BSTR;
3 o2 W7 K$ {# w* @5 X8 g        pokeVariant[1].bstrVal         = itemStr;9 K# E2 w& z5 T

/ S: Q) \: k$ V& B( Y+ n          topicStr                                 = SysAllocString((WCHAR *) L"system");
, V& [2 g2 s5 V5 n        VariantInit(&pokeVariant[2]); ) e+ l8 F0 I" C2 {. s
        pokeVariant[2].vt                 = VT_BSTR;
2 m! Z+ c% F% m. o% l$ ]        pokeVariant[2].bstrVal         = topicStr;
  Q/ u/ Q  o6 e" H9 d' ~! e- c
& x6 K4 v% T* j//        Set the DISPPARAMS structure that holds the variant.5 @0 T, Y6 ?1 n! I; r
  a9 M; l1 p% L  Z
        dp.rgvarg                                         = pokeVariant;8 K8 O% O0 p0 @
        dp.cArgs                                         = 3;
. ^; v% ~8 @: v        dp.rgdispidNamedArgs                 = NULL;. n- y; j/ }+ Q% M9 u, }, N
        dp.cNamedArgs                                 = 0;
; F* C8 y% `5 a" z* d4 L; z
2 ^. E# b0 |  b" y//        Call IDispatch::Invoke()/ P5 ~5 d# Y( \5 x

: O( G1 t( g) [, k& h0 {        hr = m_pDisp->Invoke(
( Z1 G. V0 c8 T. p                pokeID,# k. V: O8 b# X8 S' |$ }+ X
                IID_NULL,. E1 G8 l; X; ^4 g5 J2 }
                LOCALE_SYSTEM_DEFAULT,
9 e3 b- ^) N  P                DISPATCH_METHOD,0 J( \: c4 ?! K( Z4 l2 d' z
                &dp,0 Z% U2 x/ }* W* ~( [: E
                NULL,: L+ }" m! }6 ~
                &ei,. Z  T' t) `8 a2 |/ r+ p" P
                &uiErr);
; V* Q( l! R$ ?& [0 L1 a: L" J" v
        SysFreeString(topicStr);1 x; f  d, ?! Y
        SysFreeString(itemStr);1 \. J+ R- l1 l2 i! R: y
        SysFreeString(valueStr);+ ^) P" t! E( A, o
4 y4 y% l' J5 B! T, N- [8 _6 K" I! a
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
  o. m9 ~: C$ d4 n  Y: i此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
& i4 |7 |" S7 u3 ^- h' F
8 f# P8 g* e% V6 L5 @4 w& U7 |! ]/ `  C. s7 D$ e1 P
2.这是request的程序& z) `7 e3 L6 j
//  Request a value from Extend) I) p* w) g9 c7 g3 t$ }: K
//
0 ?. A# B' ~$ S4 {$ d//        Initialize the variant that will hold the BSTR.  Set the variant's
1 C% E! d, q, \3 w$ U' L# r//        type flag to indicate the fact that this variant holds a BSTR. Place the! z( y( P+ Q2 |2 P
//        BSTR into the variant structure./ y3 o2 B1 Z) s# z1 p& \. f
. r7 |  v+ c, q( P5 x
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
/ @) {" }, _% O7 [        ( O' O2 O! X' ]4 f' ]
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");: V8 S( ?  S, U6 [
        VariantInit(&requestVariant[0]);
0 i: a: `3 M6 r; C9 }: y+ P3 n        requestVariant[0].vt                 = VT_BSTR;
) S5 a- w0 u' G5 ~# i. a4 z; S        requestVariant[0].bstrVal         = itemStr;* b5 P- U: ?- f+ Z2 \
. t" c  ]% d! `; U# S7 d
          topicStr                                         = SysAllocString((WCHAR *) L"system");
# R+ u2 h7 F4 t/ N' Q        VariantInit(&requestVariant[1]);
* ]( C# W4 \' e, G0 [        requestVariant[1].vt                 = VT_BSTR;
! `2 b' E% Z5 h, W        requestVariant[1].bstrVal         = topicStr;
# p% S; F' v/ W9 Q0 G0 B
! j( [( I( i5 E1 e//        Set the DISPPARAMS structure that holds the variant.# C' l8 M' k; X6 ^, U7 L5 ^; E( Q

' l2 _$ U) Z, C8 Q5 o9 J& K        dp2.rgvarg                                         = requestVariant;
3 J# G1 }# w% J# s6 z4 V3 P        dp2.cArgs                                         = 2;) Z8 M8 o1 B* t9 g) N$ ?0 E& ^7 J
        dp2.rgdispidNamedArgs                 = NULL;  `0 \4 Y1 r/ X8 z
        dp2.cNamedArgs                                 = 0;5 n; n; s+ p4 H) o) f6 M
* x% z2 @0 G. g; K3 F5 C! D
        var.vt = VT_EMPTY;/ h: S, d6 E5 n2 \( y/ y
+ P) b! U+ Y; j
//        Call IDispatch::Invoke()8 E% |- ~. b8 a' h
9 _* x9 f1 c# ~" O
        hr = m_pDisp->Invoke(
* S, `5 u$ a4 e: {                requestID,* j8 j) \8 R3 i& z' E5 L  J6 l
                IID_NULL,- M7 T; S6 v9 T
                LOCALE_SYSTEM_DEFAULT,/ Z  L& @9 w) X) ~
                DISPATCH_METHOD,
, z5 S  a( q5 D7 E) R# Z' y  @                &dp2,
. _6 R% @# ^0 y' ^/ ^  [! }                &var,
# F% L) a$ W3 Y, x/ v  g6 Y3 L! h                &ei,) c4 p/ j9 V% B6 Z
                &uiErr);& Z2 G( R/ u( D) I% I0 x
  }$ a: ^1 ?$ \" z
        SysFreeString(topicStr);' M, M- U/ C+ u
        SysFreeString(itemStr);
2 M0 Z0 M0 }5 U9 s7 ]请问该程序是获得extend里面的哪个值?
3 y6 T( |- r0 I+ z& y9 [% e; k9 }如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2025-11-23 21:31 , Processed in 0.020416 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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