设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13373|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:( i% u8 v, i- |; W- L
Name = (WCHAR *) L"Poke";
4 P- J$ s" r* O5 X6 m/ i+ H                 % z& u  t- Z8 A+ d$ G
        hr = m_pDisp->GetIDsOfNames (
8 V: D/ Z1 K' k6 X4 R9 Y# ^                IID_NULL,                                // reserved# f! B2 @; t  v5 @% v/ ]) |6 K- ~
                &Name,                                        // Array of names to get IDs for
" G2 i( W# ]. v5 C8 K5 r                1,                                        // # of names in the array( p3 M/ a/ R- \9 ^2 {+ U
                LOCALE_SYSTEM_DEFAULT,        // System locale4 G1 V4 p' J& d& a' A
                &pokeID);                                // Array of IDs to fill on output
4 x: G  n, v0 P  Y( i                       
6 m5 P& b6 I) c: H3 v        if (hr)
5 U2 I$ f$ w  I* R% H, f& n5 j2 \$ V                {
& j# B' t* i: K5 K9 `/ W8 h$ g6 ^                MessageBox ("Get Poke Unsuccessful");
+ r# B+ o- k( o2 y                return;
) H5 F& Y7 W( K' f                }2 i9 L% \2 ~* V# e" x' ~. R0 n

! g, H# L: @9 X! _/**************************传递数据给extend**************************************/2 O  @6 f) F8 D  h& H/ W% C& T
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);6 A5 L! R. ~' O
       
* O' y4 j. V/ `2 z# z& P2 Z0 x" E+ E         valueStr                                 = SysAllocString((WCHAR *) L"1232");) P* q0 X( a: [! B& r, _- [' K+ }
        VariantInit(&pokeVariant[0]); ) H; g9 `; p7 b& V+ |
        pokeVariant[0].vt                 = VT_BSTR;: x5 x  }* d) ]% H! O2 J
        pokeVariant[0].bstrVal         = valueStr;3 a% ~, X' m5 L* [$ F% a9 [" U8 T
, h1 _* L  F& B1 v/ k2 x
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
, ?6 r, O1 F. |' }8 e        VariantInit(&pokeVariant[1]);
' S  V5 h) C, y) R2 Z# y9 f0 w        pokeVariant[1].vt                 = VT_BSTR;9 K/ S; }4 I9 @" f! u6 ~7 p
        pokeVariant[1].bstrVal         = itemStr;
4 |& z( ]* o1 y& T8 E' ^, u7 g6 w( \* }. z
          topicStr                                 = SysAllocString((WCHAR *) L"system");* ^+ W. v( ]8 _
        VariantInit(&pokeVariant[2]); 9 _; ]* k9 ^( |. o% U6 S& r9 E. j5 d7 o
        pokeVariant[2].vt                 = VT_BSTR;1 i& k, l( T1 N" |5 u
        pokeVariant[2].bstrVal         = topicStr;
6 E3 x9 H& M2 G) }3 X5 `) U0 Y3 `) U1 @+ b5 W, c; K! y
//        Set the DISPPARAMS structure that holds the variant.
4 ~# G) D" F# a0 T& s, O) J+ z1 i" h; x' p
        dp.rgvarg                                         = pokeVariant;
4 x# G6 m7 A) K, P% A        dp.cArgs                                         = 3;
3 r! j7 K8 s$ ]( j$ S7 ^& `, l! @        dp.rgdispidNamedArgs                 = NULL;3 V% G. ?6 i5 c
        dp.cNamedArgs                                 = 0;
2 K4 l! g0 A; `% [8 H9 w# O' N% P1 |: u; ^. l5 ^  I  r! l
//        Call IDispatch::Invoke()% V6 Z7 A( m5 _1 A5 r* W
5 C/ `) o! p% p
        hr = m_pDisp->Invoke(' n  {' }- n. O
                pokeID,' r! B3 O6 ~6 f4 T0 T$ `7 v
                IID_NULL,+ d9 h# _+ W$ V1 z, C
                LOCALE_SYSTEM_DEFAULT,
& [, U/ p6 t; D5 o' x                DISPATCH_METHOD,/ {$ }# t/ X! x- g6 u" n( j
                &dp,! g. }) `6 \  y; m( s2 r
                NULL,2 d! V8 x  h: k. N$ V, A, \) m2 u- ^
                &ei,  Z2 u& _$ Y( a. Q9 }
                &uiErr);
+ o' k* i# Q; \% X6 N
% n' A6 L. Y, i  [6 q  m        SysFreeString(topicStr);
' s  m# O! ~! N( Z- N8 [  C        SysFreeString(itemStr);
4 n! r( w/ b$ k8 i& _, x        SysFreeString(valueStr);
1 ]& ?. R0 T+ h& k7 W/ N* k( y
  o/ d, u- d' K现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
2 b' p8 Z% B, U此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
6 C3 g4 Q. q8 z! x& o7 V1 g7 |1 z: L
$ R; e1 C/ B- m4 m5 q+ ~" O' C' S% ^4 g6 D1 F. T" I$ E0 H
2.这是request的程序
; m/ r9 g7 f5 Q0 f, R* L# m* Z//  Request a value from Extend: k2 Z1 s# C. i4 ~& C$ v+ g
//
( r& K! V8 O: {, N//        Initialize the variant that will hold the BSTR.  Set the variant's
) Q( {, K% ]  f0 H" R6 E//        type flag to indicate the fact that this variant holds a BSTR. Place the
( b8 p8 r, U0 w//        BSTR into the variant structure.' I5 M. m" w: j5 v! _. q

. ^0 ?2 [2 ]: U2 g* r        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);1 O' Q% R( Y6 ~! Q9 H$ Y$ O
        8 h" {/ W* C: u( g+ |
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");- D' I  m% D) T
        VariantInit(&requestVariant[0]); 2 L! D8 f8 g9 A6 A
        requestVariant[0].vt                 = VT_BSTR;2 V" R) W- ?: L: U$ e2 Z3 l  T9 `
        requestVariant[0].bstrVal         = itemStr;* a5 e2 q3 y/ e$ J: R' B

. R! U# H6 D6 n: O& B; a          topicStr                                         = SysAllocString((WCHAR *) L"system");
% P! R3 o/ o$ b& X5 I- Z; O        VariantInit(&requestVariant[1]);
2 S. C5 Z) u4 P  e8 p8 c/ R        requestVariant[1].vt                 = VT_BSTR;( f/ B4 z2 I" G
        requestVariant[1].bstrVal         = topicStr;
7 C/ ]" u0 s1 W% k- s( ?3 Z. h1 m+ }7 o: J- F3 @
//        Set the DISPPARAMS structure that holds the variant.6 T0 D3 M8 f& G# x

/ T3 s9 z2 W  L- `1 e4 W  A        dp2.rgvarg                                         = requestVariant;2 x6 @4 \. Y1 M, ~. m6 \9 l0 O
        dp2.cArgs                                         = 2;
9 d! q; i3 Y& U6 Y; e8 x; V1 k        dp2.rgdispidNamedArgs                 = NULL;6 B' }, C* T. u- y  [
        dp2.cNamedArgs                                 = 0;* ^6 [, @. i! T! n# f

' B/ p' Y$ Y; i/ s% K. a$ Q# W9 b         var.vt = VT_EMPTY;
, w- f4 Q5 X5 v. b2 N" F" L" }! L* V% S8 P
//        Call IDispatch::Invoke()- C7 S% x: \2 d* a4 L
/ t7 d) X2 {! T, E
        hr = m_pDisp->Invoke(
6 l$ _1 O! o3 N% A1 I                requestID,( N/ A( ]# R; @5 {
                IID_NULL,9 p! E- d( M" Z) l7 a  F$ D* D/ j4 I) `" t1 P
                LOCALE_SYSTEM_DEFAULT,
% X: _5 o( C/ v: j: V                DISPATCH_METHOD,
# \- ]7 P7 P2 ]3 j6 b                &dp2,
4 X+ L4 G1 G1 j8 Z1 L0 ^, E; f                &var,
3 L) q  C! I" e; X                &ei,) o+ s# P* N' h8 u. r4 T/ \
                &uiErr);+ w% {# a! K% X2 z, a! f

5 }- x' [1 Z  X: v, i        SysFreeString(topicStr);
+ L0 F. F; ^' Z# C0 K- ?# S! o" N        SysFreeString(itemStr);
9 E5 c+ P- A  ^1 S2 B请问该程序是获得extend里面的哪个值?6 I/ U. y9 Z8 I1 y
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-9-24 06:08 , Processed in 0.014471 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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