设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8797|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
% o* ]/ k% r( C* h( z6 H3 QName = (WCHAR *) L"Poke";
8 w7 `/ O3 b$ H# X+ E6 [+ g7 |. l                 ( k/ L8 M9 N2 {0 C
        hr = m_pDisp->GetIDsOfNames ($ K: x8 t/ @0 l( g
                IID_NULL,                                // reserved8 ?  r# Q) x3 ?, U
                &Name,                                        // Array of names to get IDs for
0 m& \, O5 B+ t2 @' r. g/ Z' q2 I                1,                                        // # of names in the array
" M. Z$ j2 `4 ]- m) A6 G- ?                LOCALE_SYSTEM_DEFAULT,        // System locale
3 |( J7 D: X# s& d1 s                &pokeID);                                // Array of IDs to fill on output
+ W6 S/ h2 {; y1 Y7 F* w) f& W                       
, D7 r% ~8 T, w9 {3 n        if (hr)2 L0 X9 U7 M5 j& A  r3 J
                {! P4 ]$ z4 H) L, i7 i4 Q* Y& G
                MessageBox ("Get Poke Unsuccessful");
1 f; v& ~1 C  M) ~                return;: Z1 R, N2 ^1 D. e% i. W; J
                }) t2 X0 I, U$ a- \* o
' e1 V2 g8 A8 p8 p
/**************************传递数据给extend**************************************/2 U, h; D6 H! I4 c
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);! n) Q! c. p: ~' s- V8 l
        0 @$ C! y( p+ V
        valueStr                                 = SysAllocString((WCHAR *) L"1232");
" e: L1 X( G1 B        VariantInit(&pokeVariant[0]); 1 C/ d7 \1 [. c5 V: p
        pokeVariant[0].vt                 = VT_BSTR;
/ U1 C0 F# K* c& ~        pokeVariant[0].bstrVal         = valueStr;. f) ?( M) n2 K
% l0 e9 r) l2 `1 G3 A
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");* E1 l! y7 f! \* l% y' d
        VariantInit(&pokeVariant[1]);
* C* C) @3 V; v8 R        pokeVariant[1].vt                 = VT_BSTR;
) Q* e+ w4 L6 Z        pokeVariant[1].bstrVal         = itemStr;
! ?: b; `6 f% Q, D" Y5 H
/ B9 Z  C5 A  F( t' G) c% S          topicStr                                 = SysAllocString((WCHAR *) L"system");
/ ?$ H1 P" {. }/ l0 b        VariantInit(&pokeVariant[2]); * z# C( t' z7 l( U: ~0 {
        pokeVariant[2].vt                 = VT_BSTR;
4 p1 d: l6 {5 v        pokeVariant[2].bstrVal         = topicStr;
2 V% w! `; F' L1 ]$ L# M
5 t' p/ A9 \$ f; r//        Set the DISPPARAMS structure that holds the variant.
$ y- f/ ?- q- i7 V8 N( h: y: k' I9 U7 O, \' W& X. N% G
        dp.rgvarg                                         = pokeVariant;
1 L: l5 \- e, \, U4 V        dp.cArgs                                         = 3;
0 J% R/ I) c4 U* }        dp.rgdispidNamedArgs                 = NULL;
+ O  q  K5 ~9 e5 d        dp.cNamedArgs                                 = 0;
# |/ E* L$ L/ w/ x9 N) a7 x, b
& _: \2 d3 a5 k+ J$ s3 |& L. U//        Call IDispatch::Invoke(), {/ q! l$ A1 A! P9 t& `
0 B( C( h% o" c/ \: U
        hr = m_pDisp->Invoke(0 y6 G* B0 o  y8 i: B6 Y! k3 Z
                pokeID,
5 l: Z$ L0 n+ v% f( Y                IID_NULL,. B' s8 [3 t2 N! X( G
                LOCALE_SYSTEM_DEFAULT,
, Z3 s1 |7 A5 T$ v                DISPATCH_METHOD,, U. w" k0 {! }- H- L, j
                &dp,
; o2 D9 M3 T6 }$ O9 }                NULL,
9 A# L/ |# [& ]' P+ }+ r  Z- \/ \                &ei,! m" M. w. B' l, J2 j8 ^- r! u6 Q
                &uiErr);) H) Q' D1 F/ `% N6 L! \# ^' R2 {

4 r- h% m: B& v: a! J0 S0 ]! a        SysFreeString(topicStr);
: b5 e1 G+ n( s: N' P        SysFreeString(itemStr);
& ]- G9 Z, Q$ }' @" d9 n; R& Y        SysFreeString(valueStr);
) o+ U" U1 T7 k% Y! o1 L( a, A' A5 m9 r$ {& c: Q1 }
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
. q2 C) W5 e+ S* g6 _1 [0 \. J  I2 E此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????4 m1 m9 Q$ E% R- a3 G0 Z% t
6 ~5 t) z0 F2 }

5 B3 x, O! [9 y- d$ ]$ G2.这是request的程序
0 O8 ]* m5 M) f; c//  Request a value from Extend  I  k5 {6 _/ G
//6 M3 C9 _$ Y5 B3 I
//        Initialize the variant that will hold the BSTR.  Set the variant's
' e) G! x1 ]9 f//        type flag to indicate the fact that this variant holds a BSTR. Place the
- o6 B; C8 Z( y/ r1 e- K- V/ ]//        BSTR into the variant structure.- B& o# G! Z3 H" m8 ~
4 h0 l: W* {, D# [1 v
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);8 d9 k1 s' r0 \3 W7 ^  G) |% N  T5 i, ~
       
# E4 Y& s2 g# ~8 R         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
4 ^9 k6 `8 Q* C. U4 x3 L  A        VariantInit(&requestVariant[0]);
7 j8 }, w0 {  B( _! _        requestVariant[0].vt                 = VT_BSTR;
6 ^' @  T; _' e        requestVariant[0].bstrVal         = itemStr;
8 C/ H7 {4 D4 y* L3 f& r! S; K& S* X) N/ }
          topicStr                                         = SysAllocString((WCHAR *) L"system");6 b, h) p$ c5 @" M" Y
        VariantInit(&requestVariant[1]);
& W# E0 [7 v: h+ J% g; P' S        requestVariant[1].vt                 = VT_BSTR;
" {3 Z, w! O1 A! l: K8 }        requestVariant[1].bstrVal         = topicStr;
+ ^( m' Z  W. Q& o
3 Z+ f; f3 I. R" A/ X* J& x//        Set the DISPPARAMS structure that holds the variant.0 J( R, W# o3 ?/ Z$ q

/ _1 |6 `, E* C6 M        dp2.rgvarg                                         = requestVariant;" R2 V  M0 t) g  x8 x+ G4 p
        dp2.cArgs                                         = 2;0 l% G: h6 k! V! J4 e
        dp2.rgdispidNamedArgs                 = NULL;4 X! c9 `, G, y4 E5 v, d
        dp2.cNamedArgs                                 = 0;
  X2 F6 F+ C, O" `3 Q( I5 A) N' ^% q) o6 [8 B5 `5 ~
        var.vt = VT_EMPTY;% G4 o! m. \9 a/ G& G
, v/ P, W# I1 n# R# v9 t
//        Call IDispatch::Invoke()
, g# s: H6 r2 K! v  M9 O+ ^$ y
7 ~( N1 ?/ H1 \- u! @+ [9 ]        hr = m_pDisp->Invoke(
% t, A3 o  B' P5 ?- R                requestID,- D3 C) D* J) Q
                IID_NULL,9 Z2 a4 B7 @- Q% {9 v7 w
                LOCALE_SYSTEM_DEFAULT,& \+ p' u( R7 b$ T1 ?. r
                DISPATCH_METHOD,8 a1 z! o4 G8 m% Q  h% ]: S
                &dp2,
4 h, V/ Y3 ^' G3 J& @4 ^3 L                &var,
$ [' J  B# s0 }0 G; d' s& N: ]$ x* T                &ei,
- v6 W) k% }# A% F, p: R% `3 ?                &uiErr);+ f  y, P5 M( a& R

# T4 ^$ w) \1 I; B: }        SysFreeString(topicStr);
9 O6 @% A7 S# w3 m        SysFreeString(itemStr);( g: J% j; A- J1 l
请问该程序是获得extend里面的哪个值?
* ~3 L# d6 W8 p1 a; Y如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-3-16 04:51 , Processed in 0.014520 second(s), 13 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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