设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 6868|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:1 l# D1 r4 A2 C: l: p8 U7 P
Name = (WCHAR *) L"Poke";
) {4 I. D6 F7 h) @4 q; F  W$ P                
( n0 R& y" G3 @        hr = m_pDisp->GetIDsOfNames (
1 E7 w7 r3 I  Y$ m  I' X                IID_NULL,                                // reserved
3 M* O% p' S. f6 z! |) Z                &Name,                                        // Array of names to get IDs for5 P+ N8 g" v6 A& l3 E
                1,                                        // # of names in the array
' K% j# B* {, M9 }! A                LOCALE_SYSTEM_DEFAULT,        // System locale
2 L: d, S' x" y" L; M; E6 i                &pokeID);                                // Array of IDs to fill on output
( d% h3 P( T: i2 M- h* |% t                        & {0 n, n# u+ k1 P, y/ p
        if (hr)
+ [$ e: r4 g5 H                {# u/ M. r- s8 G& k; O+ K
                MessageBox ("Get Poke Unsuccessful");
. I6 N/ B+ ~5 G, ]5 M6 U" y                return;( o: H- I: P  p) ?( U
                }! q7 I7 j" w, r5 [2 w
& @: o7 ^; S' ^% s# W
/**************************传递数据给extend**************************************/$ ^  e& o6 N! r/ f+ M6 ^
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
  ?# F1 w5 R5 k        & |/ Y  @& P) n% z% j& W
        valueStr                                 = SysAllocString((WCHAR *) L"1232");1 s& U3 c0 |; F0 n% R
        VariantInit(&pokeVariant[0]);
6 `4 I* K: {: w5 t, S1 t. @        pokeVariant[0].vt                 = VT_BSTR;$ f; E: s: e8 r+ K* K& Y- {
        pokeVariant[0].bstrVal         = valueStr;8 k1 x) d2 D/ y9 L; j% s6 e

0 b* C9 ~+ A2 k' M0 N         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");  `0 D& h9 v* d* ]
        VariantInit(&pokeVariant[1]);
5 A+ t0 ^+ B; A* c" B1 N7 R        pokeVariant[1].vt                 = VT_BSTR;
3 R  H2 [6 [0 Q. f# O4 T        pokeVariant[1].bstrVal         = itemStr;
/ i# H) [9 f& D) O8 J" s, e0 I
' `; V2 z' e1 ^9 H# J          topicStr                                 = SysAllocString((WCHAR *) L"system");; Z1 u' w$ S0 R4 e- p
        VariantInit(&pokeVariant[2]); 5 k# g6 N1 v2 @0 X% a7 w* F
        pokeVariant[2].vt                 = VT_BSTR;
% \6 L- e6 @; c        pokeVariant[2].bstrVal         = topicStr;1 v8 ]  d0 w9 g2 I7 s, L. M+ D

% K; V- F0 k! m: g//        Set the DISPPARAMS structure that holds the variant.  L5 A. S5 l- S; v! X# D; [: Q

% Q  m9 J3 x' U' D8 ]% x3 Y        dp.rgvarg                                         = pokeVariant;
9 w* n" V# M$ P, i& Y/ e7 }        dp.cArgs                                         = 3;" y' x2 @' ^* {, N. E
        dp.rgdispidNamedArgs                 = NULL;
& p5 s# v+ z4 n& G5 N+ j        dp.cNamedArgs                                 = 0;
; ~  F& o* n1 q: s! D9 [" V6 I2 Y; L" b7 T
//        Call IDispatch::Invoke()/ @  C, s$ {0 r4 k
7 J4 Q3 {+ P# y5 X
        hr = m_pDisp->Invoke(* X+ L4 a: Z8 f  k7 ~& T0 Y: a5 I/ {
                pokeID,# Q( L* k; Y* k" a& p6 Y
                IID_NULL,1 K5 d) v4 z9 E$ F% l
                LOCALE_SYSTEM_DEFAULT,' }8 ]7 [) B& E0 M6 H* O# y( q- @
                DISPATCH_METHOD,
( t1 Q% O! Z0 q0 _2 p' e5 A                &dp,  g0 r$ I6 ^/ Y6 R  P8 f
                NULL,
5 e2 {, m, l4 ?                &ei,
( a& O+ N0 g1 J# x2 v, r+ T                &uiErr);
9 w# r* I" v& s0 G9 B7 |. B5 w
7 R* ]# ?' @$ e  v1 v( `$ _  K6 h        SysFreeString(topicStr);6 ]# K3 b% Q, a6 L9 o2 P- {
        SysFreeString(itemStr);
+ @9 o# b2 b$ g- }        SysFreeString(valueStr);
* e6 \3 Q7 v2 Y% U$ S$ F' i* i$ x$ e8 p' t' j/ t1 s+ \9 U4 `
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???" S3 k/ Q6 P% p& @7 q
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
0 N/ I8 C! U. f
, a) A4 L& X5 n
  I8 l8 m0 h5 L/ l5 f& n8 B/ z* v+ [2.这是request的程序
* [8 P( s9 _$ _: O& x/ b//  Request a value from Extend
1 }  `7 |4 H7 K7 v! Z( G: M//8 W7 X) l' U$ }* ?
//        Initialize the variant that will hold the BSTR.  Set the variant's
% s6 ?- t# z+ P  I5 v% l//        type flag to indicate the fact that this variant holds a BSTR. Place the
0 K( W  S9 \/ @2 ^//        BSTR into the variant structure.3 q+ P  E+ f! |) [4 ^, z

/ R, M8 \3 k0 N3 a/ K3 u8 W        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
" I5 H* t/ x# G       
3 L' O2 N7 d3 m# t         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
  \) P* y0 k5 q( c) x3 }- Y3 d( V        VariantInit(&requestVariant[0]); ' `. b7 u( N1 E( J( F7 P" Z0 `
        requestVariant[0].vt                 = VT_BSTR;. _  Y) C8 b9 K0 {$ E
        requestVariant[0].bstrVal         = itemStr;, r9 h% T2 Q: L' K; Z) }: }
& `$ p& s7 m' v* e1 U; q7 o% \
          topicStr                                         = SysAllocString((WCHAR *) L"system");) D# g( z  o+ V7 s4 T% y. e
        VariantInit(&requestVariant[1]);
: Z  U. S" i, n; N% e1 `3 B# `2 N        requestVariant[1].vt                 = VT_BSTR;
% g3 ^; h7 S3 l) j& z. }        requestVariant[1].bstrVal         = topicStr;+ |+ T" q3 }! o# c" t

9 D) o+ i' w8 z- _: f/ |  _8 ~! }//        Set the DISPPARAMS structure that holds the variant.+ s3 v" W. p" g! @( ?- j

: T/ |6 i% G: L        dp2.rgvarg                                         = requestVariant;
$ ^, c* Y- a; r3 W* X        dp2.cArgs                                         = 2;0 i9 U0 p3 q7 S2 d
        dp2.rgdispidNamedArgs                 = NULL;
9 n+ g- [% D) M        dp2.cNamedArgs                                 = 0;
; V- ]+ B0 C6 F4 z5 b2 k
  f& n/ N0 o6 w" i! H2 @, x# C5 \         var.vt = VT_EMPTY;
2 i* G, B: s2 q' j$ n- ]8 Z
& G& ~2 r. X/ C" i' k+ p5 B: z//        Call IDispatch::Invoke()
( {# r" }7 J: o. P! w, d- O( m/ A+ N! |2 W$ @8 B4 Y/ z
        hr = m_pDisp->Invoke(
: \: e" k/ B& a" y+ d                requestID,
$ ?  K8 m, y  E                IID_NULL,
- B! a2 q) D) y9 P3 ]% Z                LOCALE_SYSTEM_DEFAULT,
+ ~, k' Q5 v+ X                DISPATCH_METHOD,: }/ ^% o0 U# H0 n; t4 l% y
                &dp2,
- L$ {. d3 j2 B* s& o                &var,
( g8 ]4 `6 r5 V! n+ ~: _                &ei,
8 r% q  T  R5 B4 ?                &uiErr);' h& A- D8 x+ a5 h

4 f% D. P: [/ |3 M! q        SysFreeString(topicStr);
( U; i6 ?0 l" Y) ^$ D        SysFreeString(itemStr);  G9 h  F3 m/ a2 X" K. o% ^3 n
请问该程序是获得extend里面的哪个值?3 D% K* y4 Y! [1 g" x
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2025-12-9 18:49 , Processed in 0.014741 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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