设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13278|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
+ X: y* b. C+ iName = (WCHAR *) L"Poke";
7 W6 E% a4 f0 q) K) }5 V, x                 4 N5 U+ S3 J+ l9 W  W
        hr = m_pDisp->GetIDsOfNames (
, r- r# v! {! [                IID_NULL,                                // reserved
! _' Q: b! J; ]$ Z. F                &Name,                                        // Array of names to get IDs for
  X( m4 I9 F% t                1,                                        // # of names in the array
1 }- b! _* @+ _7 b1 K6 g                LOCALE_SYSTEM_DEFAULT,        // System locale
2 K2 M6 n% ~# {: X6 Y5 y                &pokeID);                                // Array of IDs to fill on output
# L+ D0 A( m% `3 Z3 H9 y                        ' B. U2 {/ n* O6 k1 A0 v9 G
        if (hr)" u. Z0 [+ Y& @- ?. V8 v! {
                {& e$ e. [; `  \3 _# ^" v
                MessageBox ("Get Poke Unsuccessful");- A+ F+ K& v0 n4 M8 u
                return;& n7 [$ C5 I" m8 V! S" l5 {
                }
! i; z# R$ |4 i7 S# \: h- ~; s4 J! ?; m
/**************************传递数据给extend**************************************/
! a% f$ q' {8 @7 P. A  G1 U& `        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
0 B6 R8 c9 k3 }- d% G, \: i        1 z( j6 X3 ~8 S* E# b" J: P0 c" @
        valueStr                                 = SysAllocString((WCHAR *) L"1232");4 [8 @$ s- e4 ?0 c! k
        VariantInit(&pokeVariant[0]);
- m# e  e( @- ]) F  R6 w        pokeVariant[0].vt                 = VT_BSTR;' J$ z8 w0 ?0 D: e8 P5 [5 J
        pokeVariant[0].bstrVal         = valueStr;, L  \+ N: j% X$ n2 [
) L; L- b$ E+ [: k. `
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");9 E3 j6 Z" L2 z/ E0 P% @
        VariantInit(&pokeVariant[1]);
6 A5 Y! k( E" o+ c" Q        pokeVariant[1].vt                 = VT_BSTR;4 C$ ~/ M# E+ F% ]
        pokeVariant[1].bstrVal         = itemStr;* S+ C/ r3 {" s; m* s8 |

9 S' E( U) E5 c7 n$ `          topicStr                                 = SysAllocString((WCHAR *) L"system");# k2 T3 ]% v5 A# V
        VariantInit(&pokeVariant[2]);
& P2 X# F/ s  ]        pokeVariant[2].vt                 = VT_BSTR;
3 @& l' J( g$ F0 e$ Y5 [        pokeVariant[2].bstrVal         = topicStr;
# \. M& D' V2 F1 f: i. F5 n6 j( o7 i  M
//        Set the DISPPARAMS structure that holds the variant.0 L3 R7 B1 g. e% R1 s/ `5 X

1 F% S+ T7 H3 w$ B5 q        dp.rgvarg                                         = pokeVariant;
) n; D2 C$ B# b3 U1 @        dp.cArgs                                         = 3;
! z: L. l- s- s8 ]5 g) K        dp.rgdispidNamedArgs                 = NULL;, |$ v# @  v0 J& i: V! O! W
        dp.cNamedArgs                                 = 0;, a( f/ @! j9 A
% r, Z. ?% Z- R
//        Call IDispatch::Invoke()
# B3 @- q" t; d$ C3 r4 ~  B- N! Y+ k
        hr = m_pDisp->Invoke(
- o" v% C7 Z4 k2 A                pokeID,
4 ^7 f9 ?- U! F  C, ^' b$ }                IID_NULL,% M( x+ O4 @+ O, C+ h; _, Y
                LOCALE_SYSTEM_DEFAULT,5 U4 M, H/ X% W, ?, @# Z
                DISPATCH_METHOD,2 `& w: G$ M- Q7 S+ k: t. B3 @
                &dp,
2 g) |  C0 s) b                NULL,
- \2 W. K6 ?  X                &ei,( m7 U1 y4 C+ }1 W, R' v
                &uiErr);, e3 Q! I7 _, t3 q

8 ?& }6 J8 W$ u; f5 O        SysFreeString(topicStr);
; q+ B# _" N0 V$ Y1 a        SysFreeString(itemStr);
' i6 K& W% u1 q0 Z1 ^5 w+ `( b        SysFreeString(valueStr);/ r% K1 F9 `. T* ]0 E
  W7 M0 w$ F, j, I
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???& \2 Q: [3 @( O% @, m
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
( }1 V; `. O" r9 F  R/ H+ f! d* j, O2 ^4 ]9 E9 H3 _; J; K
+ L5 C' S6 z" z9 `. g6 D& R3 @
2.这是request的程序
9 r. `; V7 e" X' g+ q) x//  Request a value from Extend
7 O, d) X' A7 A7 z8 y4 [//
( C: U, k' I/ p; u8 p9 k6 y* M4 W* d) Y//        Initialize the variant that will hold the BSTR.  Set the variant's
: j& ]7 T0 \7 @4 F% s- W6 a//        type flag to indicate the fact that this variant holds a BSTR. Place the
' s( l8 g) u) V1 f) X- ~0 X7 [//        BSTR into the variant structure.
: u- H" x7 w7 @$ |1 l8 ~+ j" p) n4 S2 c2 e
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
" Z1 j( s/ u7 ?       
% {" r( o0 n- a( A         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
2 P, v# \# B, D' d! ]* D8 g6 B5 k        VariantInit(&requestVariant[0]);
* C! n; X2 g! w2 `  C4 l        requestVariant[0].vt                 = VT_BSTR;9 {3 a+ q% l8 ]
        requestVariant[0].bstrVal         = itemStr;# u& K: w: f. c. F

& m7 d, I8 W# V          topicStr                                         = SysAllocString((WCHAR *) L"system");* v' r/ n# Y# A3 G
        VariantInit(&requestVariant[1]);
. A" B( f; [# M        requestVariant[1].vt                 = VT_BSTR;# _9 j2 [8 M3 o7 B- l( G. X& H
        requestVariant[1].bstrVal         = topicStr;
8 L6 q9 Y# X1 k/ {9 P) o8 g5 x8 w7 K& k5 K6 p% A, v+ j
//        Set the DISPPARAMS structure that holds the variant.
  ^9 K. ]2 [2 f/ D, M1 G2 F* L$ U& \: h) p' v1 E2 Y
        dp2.rgvarg                                         = requestVariant;
' I& {6 Z$ ?. `3 `. h; p# P        dp2.cArgs                                         = 2;
2 c+ ~- Z! o$ U  j        dp2.rgdispidNamedArgs                 = NULL;! i- [& O0 j8 r6 L& t* W
        dp2.cNamedArgs                                 = 0;- ]" q; E7 X, l+ W, {

3 B" \0 _& w7 q; T% _         var.vt = VT_EMPTY;
( D: b& ?$ I9 Q( ?* P, c* W0 S4 b, N* x- m7 ~
//        Call IDispatch::Invoke()% [8 w% L% K" ~; i+ v5 Z

1 {9 ^% ?  M) B" z7 h        hr = m_pDisp->Invoke(" t  q7 N3 g  q- j2 _* |
                requestID,1 Q8 M# P+ ]& p* e9 v2 l
                IID_NULL,
1 [3 H3 e: U! w/ U# W- e                LOCALE_SYSTEM_DEFAULT,
, v  K  D: S3 y0 y1 u9 ?                DISPATCH_METHOD,: F& a0 G- U* f" [+ H' q& N
                &dp2,
* k2 r/ g" X3 _- \                &var,$ {2 F9 o. |& n5 v. W% w. u
                &ei,
" T) u* w$ V5 v/ X                &uiErr);
. t' e$ G$ q7 \& H
" @9 X* ~0 S( y" }, n5 l) j' e        SysFreeString(topicStr);
' X$ h$ a; b; e! U        SysFreeString(itemStr);
6 x% e2 u5 g5 h; Q/ [8 U5 s( J, N4 O请问该程序是获得extend里面的哪个值?
% i$ g8 A7 y. m9 M如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-9-20 12:19 , Processed in 0.013782 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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