设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10512|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:2 G/ L" y" K# c: g
Name = (WCHAR *) L"Poke";8 G9 ^6 F! Y+ O! @7 z
                   \& h% m5 l4 B4 y, s5 U- ]. ^
        hr = m_pDisp->GetIDsOfNames (
  K% I* K" g# P9 p  v                IID_NULL,                                // reserved
+ B  K% y" b: T7 U+ M                &Name,                                        // Array of names to get IDs for
3 [6 p# o5 W/ X- t/ R- T8 z                1,                                        // # of names in the array
5 ^3 W1 I" X; h% o                LOCALE_SYSTEM_DEFAULT,        // System locale
' x% H* E  ?7 c5 w  e                &pokeID);                                // Array of IDs to fill on output
$ O! R& k1 R$ L1 P8 M6 _2 R                       
& Z* e+ G, N5 _% U: r& t) i        if (hr)6 j" G( T" b" P" }* K! b
                {5 x: C8 I! D$ Z8 X/ J  F" f, c
                MessageBox ("Get Poke Unsuccessful");
& V7 j( N: [  v, \& _& W  _7 E                return;+ g' j8 N' |7 a
                }
6 B1 m  M2 I$ }" A/ z: a& S
8 q: I; {8 v/ E, ^& B& Z% O/ o" @' l/**************************传递数据给extend**************************************/( M0 H# v) E  \
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
+ r' v2 Q4 x1 l) ?' O- a, ?       
) _' r7 {1 m! v  z: ?         valueStr                                 = SysAllocString((WCHAR *) L"1232");
- [/ T5 j; H8 ?( D1 p$ U        VariantInit(&pokeVariant[0]); ' G  \+ b% X3 Z$ M* T& P
        pokeVariant[0].vt                 = VT_BSTR;
" X2 t4 M, ?# D( {% t- a/ O        pokeVariant[0].bstrVal         = valueStr;
2 r/ S+ H0 }/ x( X; E# o; D: @0 |- x4 }" n
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
3 ?9 O  `5 Z4 C        VariantInit(&pokeVariant[1]);
* J- `4 N7 p& z, K9 Y5 j. Z: V' I        pokeVariant[1].vt                 = VT_BSTR;$ {+ q/ d- C* a( d
        pokeVariant[1].bstrVal         = itemStr;& \0 _& R9 d4 ~' X6 W6 S/ \

9 u+ g1 c- `9 Y          topicStr                                 = SysAllocString((WCHAR *) L"system");
* g( y! z8 c  O. p; i: ^        VariantInit(&pokeVariant[2]); - I( c7 G1 P) y- K
        pokeVariant[2].vt                 = VT_BSTR;
9 y5 d7 M; @/ l1 |4 Z8 P        pokeVariant[2].bstrVal         = topicStr;
! x; h+ z- s5 O8 g
7 q0 d" O! `/ {6 o; G' Y" D//        Set the DISPPARAMS structure that holds the variant.& G: ~: t1 W  {! n* ^  g2 X- E
# T' c1 v# C% l  z* L# Y- R; P
        dp.rgvarg                                         = pokeVariant;+ r# U, r2 d3 z
        dp.cArgs                                         = 3;
$ x) `. H5 Y8 |        dp.rgdispidNamedArgs                 = NULL;# _+ ]1 A  @' [) T: F
        dp.cNamedArgs                                 = 0;6 |& Y9 a% Y9 W* I- ^/ R$ l
: m5 q& [; |4 Y: W5 _
//        Call IDispatch::Invoke()
% v6 I& E/ I5 C; w0 S. a
( p* \7 |" r; k& S4 `7 Z$ j7 C        hr = m_pDisp->Invoke(
% ]3 Z* d8 e1 r; x) j, x                pokeID,; N3 J, E) L$ C/ t3 h
                IID_NULL,
! C9 ]% Z* a. _  L5 m6 V/ q                LOCALE_SYSTEM_DEFAULT,
" N7 f. {/ Z  l/ X                DISPATCH_METHOD,
5 K, ^$ b% H  X2 x                &dp,- Y5 k4 G+ p; v
                NULL,6 G5 \, c" ]5 W5 w/ @
                &ei,; p5 L1 `( p& V+ G! W) c8 ~
                &uiErr);
1 R+ Y/ b# ^6 X" k/ q" g0 ~: C- U3 C' E. o' T
        SysFreeString(topicStr);! r$ B( K5 a' v# Z. T9 }% u- r
        SysFreeString(itemStr);( }$ @2 n: @* T# u
        SysFreeString(valueStr);7 ~' o( [( ~- d- e) d
$ c9 t! p8 w% C5 n: @! a: X
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
( r* A% g4 |; y6 U, S此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
% q  \9 N. Y7 x8 o  a, ?- M
8 s) e: A; I$ l0 `3 K# G5 u+ m( Y$ j* N) a5 _0 v
2.这是request的程序4 I: x9 k1 u7 j2 x( `
//  Request a value from Extend
" T6 E/ x) e1 P" N. c  }. O, }//# p5 [8 J( v  w4 ^/ p
//        Initialize the variant that will hold the BSTR.  Set the variant's
* Y* }, p. V1 ~  [8 m* C$ z) W7 I//        type flag to indicate the fact that this variant holds a BSTR. Place the* D$ A: z4 O/ z2 `: {) g
//        BSTR into the variant structure.
( o. z* e& T- F# G+ H) i- s: R: A9 d4 |: }- p
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
9 C" G! f+ \* W# W7 o        2 R6 O! A5 i1 l0 l# p% P
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
6 M8 [4 Z& q3 ]3 v2 E9 ]7 B/ [& B! v        VariantInit(&requestVariant[0]); & a3 _) ~) W8 U! S9 _2 N  i9 J; V7 d+ w( o
        requestVariant[0].vt                 = VT_BSTR;' K5 E( q. R+ a7 f
        requestVariant[0].bstrVal         = itemStr;
* u& F6 ]  J4 L, ], C# ^8 q: Q; ]; w! D' ]+ ]4 H! }
          topicStr                                         = SysAllocString((WCHAR *) L"system");
9 m) ^4 R& I  H2 ]        VariantInit(&requestVariant[1]);
7 h- {' L: z1 V+ h0 |        requestVariant[1].vt                 = VT_BSTR;4 K! T! z: [3 E) o
        requestVariant[1].bstrVal         = topicStr;7 u. q- ~2 b% C# |
, ]1 S5 _& t7 R1 ]
//        Set the DISPPARAMS structure that holds the variant.
+ P: s4 j# V6 w6 V6 ~5 r- a5 ]4 n$ u' z5 k6 J) A" P6 p( v
        dp2.rgvarg                                         = requestVariant;
1 A5 t/ u. n% d        dp2.cArgs                                         = 2;
" p" t% {& k+ a1 y+ }        dp2.rgdispidNamedArgs                 = NULL;# k6 _5 K5 O& G; D- s
        dp2.cNamedArgs                                 = 0;; e; ^, Z. `/ Y2 F& I7 U) c  C

/ M8 E, Q) Q7 B; m* a         var.vt = VT_EMPTY;& W. J0 U) {6 o; W; V4 L
1 E( a/ E2 D1 U8 L- y
//        Call IDispatch::Invoke()
) q) D  C1 b, j( k1 [/ \, V" N1 I: ^1 D! v- F2 Q
        hr = m_pDisp->Invoke(
5 T4 p! ^) G* x                requestID,
; N; e4 q: \* s* w/ P9 M. y5 p$ M  l                IID_NULL,
# ?- }; L* x: }7 A8 a' _                LOCALE_SYSTEM_DEFAULT,+ o$ }* k$ t9 [: C# m( _
                DISPATCH_METHOD,
3 Q. X. B# m) u9 O+ g" O" g5 n                &dp2,
/ X  _. Y, Y- w* Y# s                &var,
& M# |. M4 j# c+ n- [& y2 P  x$ M                &ei,( Q" X: e8 }  a$ E/ ]# V5 E, u! ~
                &uiErr);9 B+ r& C$ U7 Q
7 O' i; k7 ?: m& {9 _: _3 [- \
        SysFreeString(topicStr);
# H+ u) }1 U3 \9 Q6 X        SysFreeString(itemStr);- U  }& w0 L3 {6 v% Q
请问该程序是获得extend里面的哪个值?$ D1 n" M" |- f# [
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-5-28 18:35 , Processed in 0.015812 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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