设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12621|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:# Y0 R) X- T* B
Name = (WCHAR *) L"Poke";" [! Y6 G+ l9 m9 _2 B: ?( H6 f7 |
                 / C$ ~- _, \+ m1 h
        hr = m_pDisp->GetIDsOfNames (
1 s  n& V; T4 h* V! G                IID_NULL,                                // reserved
9 ]6 m0 I! t1 }3 _( j5 i+ {4 g* \                &Name,                                        // Array of names to get IDs for# [  J, N# U- S& l3 q3 a* Z
                1,                                        // # of names in the array$ c1 Z; P/ Y9 H2 b# D
                LOCALE_SYSTEM_DEFAULT,        // System locale
& R( h- W" \7 M                &pokeID);                                // Array of IDs to fill on output
3 a7 \5 ^% b. f3 P( u                        6 d' \. I1 G8 |4 `% z* k
        if (hr)
- ^: |3 R1 q" a/ u# A                {
5 L5 R: `3 k3 n* D) O                MessageBox ("Get Poke Unsuccessful");
- P7 t! x' H/ U1 e: U, {                return;8 @/ g: c* N$ y; G5 @6 ~& C
                }
3 `. ?5 f$ |. g' J0 n/ J
8 M/ B# l' h/ {/ b. y$ ^/**************************传递数据给extend**************************************// u' W  V' |1 m' X
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);$ v5 ]7 K- N+ u8 F8 b8 K, v
        ' y. D7 k5 M* R) D$ U# N- f
        valueStr                                 = SysAllocString((WCHAR *) L"1232");
. p1 G  y% p1 A" P/ Q& D        VariantInit(&pokeVariant[0]);
1 V; C7 G9 I0 s; G# ?& _        pokeVariant[0].vt                 = VT_BSTR;4 j; Y9 I- a! V7 G
        pokeVariant[0].bstrVal         = valueStr;- j( x$ ?/ v8 V) o
  j- M- m; }" M5 c$ M+ ^7 r" ?
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
4 `; C9 s! a  U) O2 f. I6 U        VariantInit(&pokeVariant[1]);
4 S! X) Z% C# F" Q9 m        pokeVariant[1].vt                 = VT_BSTR;, u0 z; g4 d3 V8 ~. B+ |  |
        pokeVariant[1].bstrVal         = itemStr;
2 y6 g. r' \+ f6 E/ F+ k* B
# e# N& @+ c! t. i+ v2 G' \          topicStr                                 = SysAllocString((WCHAR *) L"system");6 ~! }2 G$ [, v1 S+ W; g$ H
        VariantInit(&pokeVariant[2]); ) z( b( F5 ?: d3 E  L" D
        pokeVariant[2].vt                 = VT_BSTR;. v7 Y9 f! _1 p/ ]) t
        pokeVariant[2].bstrVal         = topicStr;3 ^4 }  Y" s7 R$ |
( D. E0 T6 s, V) F
//        Set the DISPPARAMS structure that holds the variant.: W% p2 P5 |9 |5 N+ a( s8 q2 f  H* R
8 x4 Z# ]) L$ s0 e7 V$ g0 l
        dp.rgvarg                                         = pokeVariant;0 `* l. I* E/ }1 G+ ^+ W7 {
        dp.cArgs                                         = 3;
8 B5 u/ y0 A5 Z9 g/ t        dp.rgdispidNamedArgs                 = NULL;  t* ]* b5 c+ S7 M# ]
        dp.cNamedArgs                                 = 0;
8 W' K. D. U/ C) j4 ^% e) V# Z# ^
//        Call IDispatch::Invoke()3 m/ i) S% Y, L1 B+ G, |

; Y. b& v" }( v& e* q        hr = m_pDisp->Invoke(3 W, `: K) a% N$ a1 u% h* b; _- E$ C
                pokeID,7 }  g  w% s  l2 p& ]7 Y
                IID_NULL,( l6 g  b6 V" z: u
                LOCALE_SYSTEM_DEFAULT,
: u3 E( q! L9 U& B  ]                DISPATCH_METHOD,
! Y  I1 ?2 a* ~3 ~1 @' U                &dp,# b8 B4 \  \1 F8 S; \. r5 j
                NULL,
$ A' H5 z8 Q) i% Q5 B3 `1 l5 v, \                &ei,
5 |+ {* f2 Z7 a  j* `                &uiErr);' X0 m- ~+ i0 ^7 E( O( }

+ f, P$ W. H- A; E8 B        SysFreeString(topicStr);1 I# n# V4 n( A& l6 c+ N
        SysFreeString(itemStr);8 s- M3 J8 A- L5 N
        SysFreeString(valueStr);
" p! u9 C5 Q2 ?" w8 \9 l& F2 P: H4 K. g2 I- `
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
+ y' A5 q# u. w5 e3 Y" b( o6 \- p此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
1 f# f2 o% X4 i; J
) F) a, E, x- m2 Y3 a) o& V2 }3 l5 ~: I: V8 G
2.这是request的程序/ O) r' @2 Q; m! ^9 U$ |+ o
//  Request a value from Extend
$ }9 y! x) O3 l//
! \, F1 S! Z- ]# u# V  C//        Initialize the variant that will hold the BSTR.  Set the variant's
+ ]* E% x* F# c9 m3 c8 n//        type flag to indicate the fact that this variant holds a BSTR. Place the& A4 ^* |$ N+ V$ O' W+ X
//        BSTR into the variant structure.6 ^( f! J* L. N) p3 y

5 t4 _+ D2 @. i. O/ s        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
" h2 m7 w, U- h        0 L4 b: {/ O# a/ n, E
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");  R% k" D$ }# G5 g; x& r$ m" I
        VariantInit(&requestVariant[0]); 8 Q& h  @0 W/ G
        requestVariant[0].vt                 = VT_BSTR;  w9 I( [" W$ _. ]0 E
        requestVariant[0].bstrVal         = itemStr;4 b( ^; X8 ]' n1 W% q, ~. A  n) c

7 d, W, K# m% O( O0 L          topicStr                                         = SysAllocString((WCHAR *) L"system");6 W* x6 @% _3 I5 F3 b, w% V7 ~
        VariantInit(&requestVariant[1]); 4 F3 j/ ?9 H) x; r, X* u! O
        requestVariant[1].vt                 = VT_BSTR;4 a7 i4 }8 ~3 [) j9 Z
        requestVariant[1].bstrVal         = topicStr;7 s. j3 B+ g- s

  O. k5 M& s8 M' g//        Set the DISPPARAMS structure that holds the variant.. t5 z9 X+ G4 `
9 E' c  x9 z" z8 l* j) H' V
        dp2.rgvarg                                         = requestVariant;; C  [- w) ~; o  t3 u4 ^# @  y" ?
        dp2.cArgs                                         = 2;
" N9 B7 D4 c8 V, W        dp2.rgdispidNamedArgs                 = NULL;% Z4 b1 r2 e' r
        dp2.cNamedArgs                                 = 0;: {, Q9 M6 x, `7 j* o
4 R" H6 }2 |) A% }$ D7 }: o
        var.vt = VT_EMPTY;
# d" d. F- I4 |* d% h& f- N$ m: e( I5 i, r9 j, L
//        Call IDispatch::Invoke()" ~) s; B/ r" {. z7 a

& ~" u! v, R- P9 @8 x$ N8 |        hr = m_pDisp->Invoke(
% |3 `0 E3 F/ k- {                requestID,' L" H, Q. S( d. X
                IID_NULL,
3 ?4 T7 E+ }5 P7 ~8 U3 e5 v  l/ D                LOCALE_SYSTEM_DEFAULT,
0 Z* I7 l8 B* Z$ O: o/ E# H1 }                DISPATCH_METHOD,* w! ?/ g& I3 F5 z5 k4 `
                &dp2,
7 v( V8 D) k( @# i. t2 j  ]                &var,
& @" E& g8 f6 x, n9 a                &ei,
+ w3 ?) s4 f# y( C3 h! e                &uiErr);
: |* q/ k6 Z. l8 A& V7 W2 v  c( h' @) d
        SysFreeString(topicStr);0 p/ P+ k* }3 Y" y8 y
        SysFreeString(itemStr);# f3 U; E% O& ]; U! J- M. k
请问该程序是获得extend里面的哪个值?: a; ]6 `/ m6 b. X# K+ \
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-8-21 16:25 , Processed in 0.015877 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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