设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13086|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
% h* c! ^4 a8 g- cName = (WCHAR *) L"Poke";
' o0 N; m3 v3 F. C                 ; B9 l/ g$ @0 ]* y8 Q/ U8 \
        hr = m_pDisp->GetIDsOfNames (/ k8 V; o& e  ^8 k' M
                IID_NULL,                                // reserved) |; x! V# B+ u7 h% j2 s6 ]4 D
                &Name,                                        // Array of names to get IDs for
# U. l! b& }4 n5 ~: Z7 N* M                1,                                        // # of names in the array5 K% M# D7 {. @( s+ o
                LOCALE_SYSTEM_DEFAULT,        // System locale
7 Z6 z  _  Z0 }# ?( m8 N! F                &pokeID);                                // Array of IDs to fill on output
* c  e; I9 r/ N6 ^6 v                       
" o' A2 t$ Q/ o+ O9 e+ Z4 Y        if (hr); o- @3 b3 F/ Z8 v* [
                {8 n) C+ r1 ?3 n) s$ J
                MessageBox ("Get Poke Unsuccessful");
0 S+ s" N  O8 S3 e3 c                return;1 [5 E5 b& s; w8 u" x. `0 R9 q
                }; W+ |4 w: Z' m3 [& i3 N( b
, Z. `( _9 r1 C7 c: W
/**************************传递数据给extend**************************************/7 ^' N) c* @& x, w0 I+ O
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);* f  k6 k. N9 \( |0 S
       
2 }& T7 y. H" Z+ ^% n0 `. y         valueStr                                 = SysAllocString((WCHAR *) L"1232");
: s+ L, `+ }2 O6 y/ C7 K        VariantInit(&pokeVariant[0]); % G. e* J: Y' L
        pokeVariant[0].vt                 = VT_BSTR;7 M2 \$ `* M# [; `3 W  C
        pokeVariant[0].bstrVal         = valueStr;
5 ~% m0 ^/ `: Q6 {$ B5 S+ B: P: b. l0 U6 R; x! k* l
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");2 U4 _1 H, v' k! u" k3 D- ^
        VariantInit(&pokeVariant[1]); , b" k, z; n5 W# W3 t( s% [8 K
        pokeVariant[1].vt                 = VT_BSTR;
9 f5 o" q& q1 e        pokeVariant[1].bstrVal         = itemStr;
* h4 m# j& B, p* _7 m; j" }
, [& B' A. v8 E          topicStr                                 = SysAllocString((WCHAR *) L"system");* o, P! O9 K1 F' D% y
        VariantInit(&pokeVariant[2]);
* D+ ^: M# v8 u4 K" f/ M# H        pokeVariant[2].vt                 = VT_BSTR;: M" C1 w( t6 @4 R' G
        pokeVariant[2].bstrVal         = topicStr;7 G( d( X+ d- P' s/ _

( a9 p. G, F  V5 U# T0 `" E//        Set the DISPPARAMS structure that holds the variant.
% }9 w9 \" U4 {! Z- N5 x! |4 a, y
        dp.rgvarg                                         = pokeVariant;7 y  ^+ ^0 O" b" q5 I* v5 I/ D6 }
        dp.cArgs                                         = 3;
: @; A7 |$ Y; t( L        dp.rgdispidNamedArgs                 = NULL;1 `' t3 Z' Z/ T
        dp.cNamedArgs                                 = 0;
  n' [2 U; O5 T1 G1 V6 `" v
# b# Q0 a& w5 H2 r0 A$ n8 U1 h  |6 @//        Call IDispatch::Invoke()1 m' h8 }7 U/ O
2 W* c& C3 c) @
        hr = m_pDisp->Invoke(
! V$ ^6 q5 @' G7 W" H. N                pokeID,8 |/ u% b3 t1 _) Z1 H  X! S
                IID_NULL,9 x, v; `  Y6 K+ @8 ^: ]# R: c
                LOCALE_SYSTEM_DEFAULT,+ Z* _8 H: p# }* G$ ?
                DISPATCH_METHOD,+ Y! _; U% }8 ?+ D1 O& p
                &dp,
4 L: i4 n( Y1 D9 g$ G                NULL,
1 T/ S, o, m3 V+ f6 @1 H                &ei,+ O0 @* w( k0 c9 {( @. ^6 S
                &uiErr);1 n! N( A$ b: ~! Q% U$ n8 u
4 C. B/ E* v1 z
        SysFreeString(topicStr);
- }$ x# `+ t4 T6 L5 @        SysFreeString(itemStr);  ?9 b# w, b* V# \; ~
        SysFreeString(valueStr);
7 |/ P% ]/ o; U
' a* n' u) ~2 P6 L7 d2 G% O现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???- t1 Z% K1 o7 l' y* I
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
) P# Z% l  s) n9 ?; B4 w! h' m0 E- D

; d9 E' P. v. f/ s) w0 P3 r4 M2.这是request的程序
% O% q1 _$ J# P, X/ @//  Request a value from Extend
1 N5 ^' Z( }7 S3 l- C* q//
8 \1 Y  B; ?) D3 ?, U% \" C//        Initialize the variant that will hold the BSTR.  Set the variant's
, {1 ^6 F6 k# j3 b: f$ i//        type flag to indicate the fact that this variant holds a BSTR. Place the9 a( {* g; h8 P. q' t4 ^1 l
//        BSTR into the variant structure.
7 M6 T' H6 e. a2 z: q
) Q* s2 X) Q6 E6 c/ c        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
' S$ w* i: S8 M) D% j3 z6 ?        1 V: a2 h; o5 ]' X; J8 \1 @
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
* }9 b! ~$ ?% w        VariantInit(&requestVariant[0]); " Y& P% w! i0 M6 F0 E2 x: i
        requestVariant[0].vt                 = VT_BSTR;
+ ^* W6 M/ k5 F2 D' @        requestVariant[0].bstrVal         = itemStr;
( W7 p. k% S2 ~! q& `4 D: D3 v) _/ F3 P& F. H
          topicStr                                         = SysAllocString((WCHAR *) L"system");
4 J8 D! _2 ], i9 |6 {- Z2 G% J  [        VariantInit(&requestVariant[1]); 9 N- L  R$ j3 @
        requestVariant[1].vt                 = VT_BSTR;
  G! w) y  q' ]        requestVariant[1].bstrVal         = topicStr;
* Q* r" S) Y8 W' S
: R1 E8 I8 W' S4 H! a//        Set the DISPPARAMS structure that holds the variant.2 G5 X! s& \" Z  l* D6 A
  A+ ~0 g4 R: x% U4 q8 j
        dp2.rgvarg                                         = requestVariant;
: p7 I6 V. a- H7 q0 S0 q9 ^) o        dp2.cArgs                                         = 2;: y# h: x' g2 Y+ Q. F
        dp2.rgdispidNamedArgs                 = NULL;) C, X+ j) P, S& x* l- i; ^0 D8 ?1 M
        dp2.cNamedArgs                                 = 0;, |8 D9 a) H$ B

  K5 ?3 R; U4 S# c  A7 Q         var.vt = VT_EMPTY;
: j+ j# {6 }: ]% z1 K
: E& r8 b9 P+ K8 r6 V3 |1 J+ @//        Call IDispatch::Invoke()3 z" Q7 r( H3 z6 _5 r" F1 O, D
4 y* D3 C5 a+ ?  s% Q; d" L8 f
        hr = m_pDisp->Invoke(
. w- ^: ~' U; H                requestID,8 V# _* P4 b4 B; c+ @# Q7 ?% z  W
                IID_NULL,4 J* R# |4 [5 J7 G
                LOCALE_SYSTEM_DEFAULT,
6 Z1 e0 a: {; Q% O! X                DISPATCH_METHOD,5 |. h$ l. U' c+ f, _) q
                &dp2," c7 n  S8 S: M% n
                &var,' t. O2 M7 P! [- r
                &ei,$ X! p1 H5 W5 t) ]; \; n' w4 a
                &uiErr);
& |, p! b, B8 E! m7 R2 |' }  l1 i' I6 H3 Y2 O6 N1 g8 v
        SysFreeString(topicStr);' P) M7 I$ M7 }- n
        SysFreeString(itemStr);4 t9 i, N2 X5 d( v! w# p" M
请问该程序是获得extend里面的哪个值?
  |7 ]( v3 i' y9 a如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-9-12 00:10 , Processed in 0.014939 second(s), 13 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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