设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7248|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
4 R1 i+ Z5 s/ Q( j; ~Name = (WCHAR *) L"Poke";, P/ Y5 ~7 v1 q; I; v
                 8 B: k9 l# Z6 D7 `( W
        hr = m_pDisp->GetIDsOfNames (1 K3 R& @* z, P+ s% s; v
                IID_NULL,                                // reserved& Z5 Q, ?; W2 v6 l5 @; q# b# A4 v5 P
                &Name,                                        // Array of names to get IDs for
2 e. C7 n0 g# L8 I0 ?9 X/ `! f                1,                                        // # of names in the array
; n3 l$ Q2 h! ]- A                LOCALE_SYSTEM_DEFAULT,        // System locale
+ z9 m: Z* W/ ]% o& k, e% ]4 k                &pokeID);                                // Array of IDs to fill on output
& N# N7 S+ c; i- [( m                       
5 H) i* @+ v! {- F( T1 W1 q        if (hr)" h1 ]# v9 x! O, v/ M; B
                {
' C: @3 a& @9 V) u; F, ]                MessageBox ("Get Poke Unsuccessful");
+ y. e1 M7 ~% ]1 A- Z! Z. b                return;; t3 R1 R- T3 s6 e" b' G, W; t
                }7 T+ Z5 c* B& F0 L$ D8 F
0 O/ B4 |3 b2 H3 j9 b# x5 T
/**************************传递数据给extend**************************************/
6 Z0 l, {2 f+ c        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);- j0 ^2 C+ V4 I$ G! u# l) G
        ) M' k3 O2 J6 e# u( a3 {5 V
        valueStr                                 = SysAllocString((WCHAR *) L"1232");
- k  Y6 f" r6 f        VariantInit(&pokeVariant[0]); . L& N. d0 r% [. W
        pokeVariant[0].vt                 = VT_BSTR;
" i  V. J4 v- p        pokeVariant[0].bstrVal         = valueStr;
/ D5 K3 a0 G+ @. |4 H9 {* k, H9 c, E9 h6 O" \1 M2 V0 q7 {
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");1 {2 i5 C0 F  Y& e$ p' B; Q
        VariantInit(&pokeVariant[1]);
; n  |/ h* i# S0 {& t) w+ h        pokeVariant[1].vt                 = VT_BSTR;! k, z, C& z- g' k; U
        pokeVariant[1].bstrVal         = itemStr;
+ v/ H% }# Y  w$ Q. s) X( q
, i; H3 S8 q* ~& G# N' }: E; p          topicStr                                 = SysAllocString((WCHAR *) L"system");. x3 X0 x- Y) R# W5 C
        VariantInit(&pokeVariant[2]);
/ W8 G3 p' u/ b9 M        pokeVariant[2].vt                 = VT_BSTR;, W9 L+ u! [) R3 j1 v
        pokeVariant[2].bstrVal         = topicStr;  H/ ]: R+ d  O" X7 h

7 j% A7 f! q7 ^//        Set the DISPPARAMS structure that holds the variant." x9 U4 h) B! P4 ?) P

  C: w7 [/ o* I/ c        dp.rgvarg                                         = pokeVariant;+ [- V# A  l, e: V1 V
        dp.cArgs                                         = 3;' M0 l) @' ?. w$ U
        dp.rgdispidNamedArgs                 = NULL;
: [7 L3 ?( S7 K) v5 G        dp.cNamedArgs                                 = 0;
; F) v( K2 e$ U& Z' y
5 v/ a& H6 S' g, n  o: Q//        Call IDispatch::Invoke(). H2 k8 g0 _7 X) y4 T9 T
3 {' Q9 d' F. W. C5 c: I
        hr = m_pDisp->Invoke(
5 S- T6 A0 q, X5 H, ~* |                pokeID,
3 \. M( s# u6 `. G+ W. p) M                IID_NULL,# @/ O( ]3 t. W
                LOCALE_SYSTEM_DEFAULT,6 v7 d" j* R* _) }" t  H  _1 ~0 ^4 s; p
                DISPATCH_METHOD,
2 H! `$ i9 i* {                &dp,. |) A1 r) ]( e, v1 f$ V6 I* Z
                NULL,$ k+ K3 k# e( A) ?' R( X
                &ei,6 H$ @% j2 r( X3 @- ?
                &uiErr);
8 u4 c( E4 H8 R
8 F6 F) C: w* o4 {+ B9 \0 a* o4 d        SysFreeString(topicStr);
; d8 B2 f. L; s% S4 Z% p: T        SysFreeString(itemStr);& [% X, d$ M& `6 H: a) y  ~, o
        SysFreeString(valueStr);
4 d+ Q( `& O9 P3 n! s, G
7 o) H  H6 ^: u& M现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
' ~4 z5 ~( M4 |% f. x. w/ B此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
5 M% U* j1 E" b, b
* C. A' y" i: p1 H+ j
  a; C' n) r" T8 k3 G' g9 S2.这是request的程序
: j% ]" R& [8 @; R9 G6 }//  Request a value from Extend5 C! @: j4 p1 b# O
//. i1 h9 s: U  `
//        Initialize the variant that will hold the BSTR.  Set the variant's! d9 |" d: a1 q3 H% d) N
//        type flag to indicate the fact that this variant holds a BSTR. Place the
: H% p3 x- T3 m7 e//        BSTR into the variant structure.
; I1 q% q1 @  [  q  h4 I3 R+ e) F
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
$ j: w; q' y) B3 S2 r        * ?& p; @4 `) f1 `0 W, w) q5 m( m
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
4 k0 |( a; K* i        VariantInit(&requestVariant[0]); 5 A$ a/ q$ F/ _: V" C
        requestVariant[0].vt                 = VT_BSTR;
6 d  j. {4 ~: R% A        requestVariant[0].bstrVal         = itemStr;
1 N$ ?6 W+ N/ {: |- I* ~) O0 y' X  c1 m( e1 R
          topicStr                                         = SysAllocString((WCHAR *) L"system");
4 ~) }2 i, T% j        VariantInit(&requestVariant[1]);
& j  F; G3 V2 ^8 L        requestVariant[1].vt                 = VT_BSTR;
& N9 d0 G( a2 ]2 c# X        requestVariant[1].bstrVal         = topicStr;
1 L: a4 J( p( S1 S* T: Y2 t& F5 h& v" _0 x
//        Set the DISPPARAMS structure that holds the variant.$ b$ _: ~/ d7 D/ p/ \
+ Y0 o( ?2 R, \' _
        dp2.rgvarg                                         = requestVariant;2 p) }0 J; o  i# a) {
        dp2.cArgs                                         = 2;5 h  B+ z6 Q2 M$ [
        dp2.rgdispidNamedArgs                 = NULL;: h. @, K' V3 S- b: y0 P  k, P
        dp2.cNamedArgs                                 = 0;
: Y5 q9 e  b4 m
: ]7 h$ G, u2 M( C/ h5 j5 _) J         var.vt = VT_EMPTY;
5 ?* `; d  N) L7 H6 y* w4 m1 f3 Q4 S; r: }: W5 d: J
//        Call IDispatch::Invoke()7 e% N/ g) }; m  r

# \: V6 j$ p" M$ m        hr = m_pDisp->Invoke(
, N* a; I9 [6 E& w9 j                requestID,
, W9 R; H7 [: u3 E5 ?9 I9 s2 l/ V  `                IID_NULL,
! W0 ?, m# Y, c! P2 i0 l                LOCALE_SYSTEM_DEFAULT,
& o- u. q, W# H# [+ }                DISPATCH_METHOD,
  t! b  q+ x: b& C7 j  O# b                &dp2,
  q- {' @& u4 |6 V                &var,
0 e+ P' ^  R" W' \! X" u                &ei,
( s2 t9 t( d. _0 r3 j* `                &uiErr);
+ l, z; g0 b6 H  r  D+ r+ M$ ]# u6 I3 D* S" t
        SysFreeString(topicStr);: {' Z7 M( t1 n! _' t" {4 F
        SysFreeString(itemStr);
: @1 ]' ?4 Z) t% H3 W9 s. G' T请问该程序是获得extend里面的哪个值?. t' U" s* h7 @; ]! o
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-1-9 06:37 , Processed in 0.015968 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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