设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12722|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:7 [; x2 S* B7 z, W
Name = (WCHAR *) L"Poke";8 r' q5 s, F. `! p5 C
                
' y, E- a8 v+ h- F" u4 w7 U$ ?        hr = m_pDisp->GetIDsOfNames (9 J$ i6 X2 L: x$ }2 f
                IID_NULL,                                // reserved5 b' D/ p0 b0 d9 s) m
                &Name,                                        // Array of names to get IDs for/ O. Z1 F0 E  K! _2 Z9 A
                1,                                        // # of names in the array" g. W" ]2 {6 V( c; s" p
                LOCALE_SYSTEM_DEFAULT,        // System locale
1 w3 L! `8 J8 _5 b                &pokeID);                                // Array of IDs to fill on output
1 M' h3 d; c$ `# k- ~7 X" q6 Q                       
6 c& ^! O/ h9 R" n3 d6 \3 k% {  V        if (hr)
! P/ U" Q+ j7 |9 Y                {
- T/ u# W) q) X                MessageBox ("Get Poke Unsuccessful");/ A$ }9 ?+ j8 u' d( M
                return;' ~% k7 B* G: z- f
                }
2 J/ j1 m6 H( H* d3 \3 \( p7 t1 X" e* V; f
/**************************传递数据给extend**************************************/  l2 W: t; S5 m
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
: `; r3 r$ b3 l& V- I% B- q; y& O1 q        2 @! W: O' N' e" A* m
        valueStr                                 = SysAllocString((WCHAR *) L"1232");" G6 Z! g, t  H' R7 Q7 a
        VariantInit(&pokeVariant[0]);
: V! c7 X; A/ @' Y7 y+ |9 F5 O! J        pokeVariant[0].vt                 = VT_BSTR;
' |6 u5 \' }  R& e5 y3 @9 `        pokeVariant[0].bstrVal         = valueStr;7 N: Q$ O0 C. C; `! `1 R
  K7 ~/ `) I' k( g  u" P
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
: F8 _* @3 R: x: k& r, ]/ K9 l) u        VariantInit(&pokeVariant[1]);
  d/ l0 N  I4 b! {: {        pokeVariant[1].vt                 = VT_BSTR;8 G- N7 v8 G' F( K% j6 F
        pokeVariant[1].bstrVal         = itemStr;! ?% ]7 K3 ^- i0 e: m  c5 K

' Z1 }, p; g- q          topicStr                                 = SysAllocString((WCHAR *) L"system");# I9 c; ^0 w0 E$ x
        VariantInit(&pokeVariant[2]);
/ o1 W. ]' o8 F9 w        pokeVariant[2].vt                 = VT_BSTR;3 g( X5 E8 @/ j: s; I
        pokeVariant[2].bstrVal         = topicStr;
6 g8 u: }  R; F3 F: T2 b0 u1 J2 \! I2 Z# e8 U5 p8 g5 ~4 a$ X
//        Set the DISPPARAMS structure that holds the variant.4 Y/ F! w) N6 T7 {
% ~, f  O/ \- v1 Z) s0 t& D
        dp.rgvarg                                         = pokeVariant;- |( M& j; U% [+ f3 N, a
        dp.cArgs                                         = 3;
( h9 S- p- |, [2 Y' y) w1 l" c        dp.rgdispidNamedArgs                 = NULL;% O7 ^" F" }: L3 ?
        dp.cNamedArgs                                 = 0;
; o- n' y5 j3 R6 w% F4 H1 o# _) T
- r1 s# P( X/ \. d0 g) P; [//        Call IDispatch::Invoke()
: Q4 |% G; X# @1 ~& _; Y. q- |
# |! ^; M9 B: l' \! O/ M        hr = m_pDisp->Invoke(8 \" K+ u+ j! I9 J% U  h) _
                pokeID,
& j9 m- P2 q) j                IID_NULL,
, ~7 ?  _3 O& ~. L" W5 b3 @                LOCALE_SYSTEM_DEFAULT," Q1 a' d6 x# [" f! H
                DISPATCH_METHOD,: p  x% ~. r' b, {# {( a* U
                &dp,
" j' J+ Q  X& }2 H                NULL,
1 v% k5 ~* [; E                &ei,
6 a: ~- O! i! \* H                &uiErr);' J+ z8 t9 ?9 A3 @: B! ^( O; E& X! D

" t2 _% W! t) _" ^% S, k7 c        SysFreeString(topicStr);
0 b( m4 M9 h! r3 i        SysFreeString(itemStr);
6 o9 z/ O  ^" O& ^- j, Y. X        SysFreeString(valueStr);2 N9 T, e( [2 b/ a: W% Y
% W! |6 v8 a* z0 n8 x
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
3 G6 g% E( T7 [; g/ Q此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
& E' J" D. W: R  F
1 _" S& ?: R- Z" n" ~( Y  {8 e, O. g  D; R- T1 E
2.这是request的程序
- J# |1 v. X9 J) Y//  Request a value from Extend
) I2 w* G. u, |8 p) `$ Y% o! n//
' i# L  B' [1 C* \; A5 |, V6 c//        Initialize the variant that will hold the BSTR.  Set the variant's
3 G# m' k2 C( J! P5 P7 ~//        type flag to indicate the fact that this variant holds a BSTR. Place the
6 F$ Y0 P" x9 y# B& f5 j//        BSTR into the variant structure.
" S0 I6 g4 F" n6 e0 U% \0 D* Y: u* |3 g4 B: ]8 L1 ~
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);' g1 |& @& M# x6 J
       
1 U6 Q' n3 d# W1 p# e1 P         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
. H8 N- y. ]/ |        VariantInit(&requestVariant[0]); 2 A' p: k: J- Q' z. T7 a5 r$ ]
        requestVariant[0].vt                 = VT_BSTR;0 b- r8 Q3 w- Z$ v
        requestVariant[0].bstrVal         = itemStr;
- T' i0 }+ A& c" S0 z- P  [( E
- ]$ g. Q) ]# k0 x" l5 @          topicStr                                         = SysAllocString((WCHAR *) L"system");
3 i( v6 ?) Y1 E        VariantInit(&requestVariant[1]); $ e! \. {& w" V; T6 @, e
        requestVariant[1].vt                 = VT_BSTR;
) j5 ~' l9 r6 w: a7 ?$ K        requestVariant[1].bstrVal         = topicStr;) R6 u0 O1 G& k/ w- k

: w+ B2 W4 z) I2 l//        Set the DISPPARAMS structure that holds the variant.
- x& b% y8 o& [
! d1 T: ~- E, e/ P9 t! d        dp2.rgvarg                                         = requestVariant;
, X% \5 v. p5 D- U+ u0 ^( e$ V4 h        dp2.cArgs                                         = 2;3 A" g) Y& l  a+ a% W/ y% X# M
        dp2.rgdispidNamedArgs                 = NULL;# g9 D' C1 X! H6 {" l; z
        dp2.cNamedArgs                                 = 0;& `( Z) ~! v+ y( O: H  [

+ K5 B+ a, T* ]% B6 k1 k5 z         var.vt = VT_EMPTY;
' a& E2 k: H* @
' K( ]) ?6 g$ S' O& J  j//        Call IDispatch::Invoke()
9 b6 u1 m+ K6 S: O& }5 p
8 v& ~; F* J& V1 a" z% a        hr = m_pDisp->Invoke(
+ X2 }& J9 B# [. g9 A6 o2 g                requestID,
- c: e) U' n* {  Q7 J                IID_NULL,, m' M3 e) Y& R" l& G. \
                LOCALE_SYSTEM_DEFAULT,
6 b5 p. D! a5 f5 a! A# n" x1 r                DISPATCH_METHOD,
2 G; w1 F( g5 Z, _7 E  J                &dp2,
) P% i3 S7 B. I2 V0 A                &var," n% Y0 O- p# J4 W9 ^; y. v$ i! `
                &ei,
# k: K7 L8 f1 m9 Y2 C8 A                &uiErr);
. @, p0 v/ k, e4 H, s6 W+ R
! m; {8 G7 t, K* }9 G        SysFreeString(topicStr);3 C2 s& M& J7 h/ Q" O) I
        SysFreeString(itemStr);
: H0 L/ X& H& H3 u2 \# p: x4 [6 x请问该程序是获得extend里面的哪个值?
4 G  d7 e4 R% t如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-8-26 14:15 , Processed in 0.013521 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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