设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11664|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:  `" K& {* A9 b1 r' Z5 G: I
Name = (WCHAR *) L"Poke";/ \5 y, ~" W+ d- l- f
                 8 |) U7 E  r$ Q! |" N' N5 J
        hr = m_pDisp->GetIDsOfNames (
# F! J* G/ w  ~% g, l                IID_NULL,                                // reserved
' {0 D1 J6 g' J7 Q- R                &Name,                                        // Array of names to get IDs for1 k9 C- d9 L5 v$ u4 |" x
                1,                                        // # of names in the array
7 |2 L( s3 J' a' S& \                LOCALE_SYSTEM_DEFAULT,        // System locale
4 W+ M7 \- P7 T# q/ x                &pokeID);                                // Array of IDs to fill on output. M/ ~1 T  B0 o$ U: B$ C9 X
                       
- V* c) M( L7 _0 X3 h$ m, _        if (hr)
* P8 Y% |" f8 ?" u/ u7 O                {$ u3 Z: }& p/ @6 ~4 c/ d4 H
                MessageBox ("Get Poke Unsuccessful");
( @5 q$ ?$ H0 F                return;
$ T4 i6 ~1 ?; a) w& q# t+ L$ c                }
# s$ j# p4 l7 g! C# |6 Y$ a8 h
: H% }/ [, ]1 s3 {0 D/**************************传递数据给extend**************************************/$ U! W; f. @: |
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
6 u9 @& ^( H/ _, Z       
& U! }4 M9 \+ g3 A8 O, {8 _- Q         valueStr                                 = SysAllocString((WCHAR *) L"1232");9 A/ Y( Y8 {3 b8 z
        VariantInit(&pokeVariant[0]); ! W% ?! w1 K# _* \7 h
        pokeVariant[0].vt                 = VT_BSTR;4 f. J/ g' E; J0 P( d4 t+ u
        pokeVariant[0].bstrVal         = valueStr;7 L$ e2 K# w* v8 y5 g8 F( U
( j- X& k+ ?' U' s7 T" R, z
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");5 M3 n; `4 t$ K( q3 Z
        VariantInit(&pokeVariant[1]);
8 k$ Z. X( H* m" S- @! w8 t        pokeVariant[1].vt                 = VT_BSTR;
/ u- E* k  ^, X9 F4 W& L4 S6 l4 I        pokeVariant[1].bstrVal         = itemStr;, F2 }* O$ U) j  l

( D; }' }0 m& w6 h0 w& \          topicStr                                 = SysAllocString((WCHAR *) L"system");
7 ~/ X0 T! n# z- W        VariantInit(&pokeVariant[2]); 6 M3 }- y; b! r) P3 g
        pokeVariant[2].vt                 = VT_BSTR;4 r5 \* Q2 W: H" `6 D
        pokeVariant[2].bstrVal         = topicStr;
: s2 ~8 r. c0 z& C* @9 i
8 A9 |3 }2 F5 m8 g1 u//        Set the DISPPARAMS structure that holds the variant.* o" \5 S* l7 B" x, K4 M

0 m2 y" N- l2 ^  B+ x        dp.rgvarg                                         = pokeVariant;
6 b$ \& }" f$ s! G        dp.cArgs                                         = 3;" J8 `6 o5 n% D7 B8 Q) H. R; p+ }% G
        dp.rgdispidNamedArgs                 = NULL;
* |- e; y1 f# U- c- G2 d        dp.cNamedArgs                                 = 0;3 g, A( u8 c) g/ j4 l' I
6 R, `: Y0 a8 p
//        Call IDispatch::Invoke()
0 p& N" i7 ?! s9 n5 F, G& q2 ?4 s
" e3 s. x+ x  O4 O3 x        hr = m_pDisp->Invoke(
) C0 ]" M% _, o8 i2 g                pokeID,) Y2 {5 v6 v0 z& @
                IID_NULL,
  c! {  H" b0 k) a' Y% e. d                LOCALE_SYSTEM_DEFAULT,$ {, b' `0 l" I  W/ Q6 v. s+ j) Q% O1 @
                DISPATCH_METHOD,7 D4 }* k/ A4 N  q, @
                &dp,$ M3 |; l. c' B6 V6 G% g4 u2 w( U3 ~
                NULL,' Y' z9 E5 p$ A0 P7 Y+ J7 i
                &ei,& i8 U2 Z4 O" G7 G% D. f
                &uiErr);
- Z# _6 c$ v. ?1 x( P
# c7 o( S, I) x) s        SysFreeString(topicStr);
& w, ~) i2 m- u# T' S  k5 Q! w        SysFreeString(itemStr);' p- w' A0 V0 G
        SysFreeString(valueStr);2 A9 j3 I5 m: @: B  M4 c" b
/ X& l- n9 f/ `# x1 z8 P
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
' l/ g* S  v3 d% E; H此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????- `" q7 V( O# W1 Q2 o" i& R
+ Q. A( `  D- p& m3 V
: }- G8 U* P) }& J0 w
2.这是request的程序
) L( f% O8 i7 s# \& H4 B//  Request a value from Extend
+ e3 G1 Z  F/ m4 U//
4 m/ m: d. P/ J: S. B& K8 g//        Initialize the variant that will hold the BSTR.  Set the variant's5 V; M' _! N2 s- r. z
//        type flag to indicate the fact that this variant holds a BSTR. Place the* x. g7 q* e6 o+ ?# B
//        BSTR into the variant structure.( X; @- O( A/ F5 Z% |7 x- i

7 Z! B/ k) I, N$ o' \- @        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);4 N) y; t" ]8 O  V, i5 ]
       
1 y" l3 I- h0 a) b  ?. z5 k         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
! l9 |  b0 B& i4 L8 x: P% Z0 i        VariantInit(&requestVariant[0]); " o9 K7 `9 M+ M) x, `* k5 U
        requestVariant[0].vt                 = VT_BSTR;
; c6 z2 p6 U. @4 X+ S9 `( U        requestVariant[0].bstrVal         = itemStr;- \" K1 y* P9 \- a
# W9 {) J. O' m9 Z
          topicStr                                         = SysAllocString((WCHAR *) L"system");
! Y* U0 L+ E) J) c        VariantInit(&requestVariant[1]);
# W# o& E; j# E9 u        requestVariant[1].vt                 = VT_BSTR;" N, O+ S  p% F5 w+ i& d7 r
        requestVariant[1].bstrVal         = topicStr;& c- C7 |. d. _9 x

% Y9 R$ U4 }9 S% l/ y1 n. ]//        Set the DISPPARAMS structure that holds the variant.! S. M- Y6 @+ y: g% C6 ~# J
) b4 `2 S' M5 z# o  g
        dp2.rgvarg                                         = requestVariant;( v+ k0 i7 k/ F; q' P
        dp2.cArgs                                         = 2;1 }# a* u# e) x, ^) p
        dp2.rgdispidNamedArgs                 = NULL;
3 H+ P9 P4 G+ G# ~) _+ A* [        dp2.cNamedArgs                                 = 0;4 N& R' S4 z) }' [
1 b& U/ h, L- c# {6 `, C
        var.vt = VT_EMPTY;2 z( G" K0 f1 `. _/ x9 x

- K' u# ~  f  \0 z  p+ U//        Call IDispatch::Invoke()
7 K2 Y, T: W, R. u5 ~7 n( [7 M# ~* u) `
        hr = m_pDisp->Invoke(
* \; o0 g9 c! Z5 W* d  B                requestID,
7 c4 `" M( e7 m/ K, F                IID_NULL,
" P8 {( u- H5 m9 P" u                LOCALE_SYSTEM_DEFAULT,
2 N) M, i% g' c6 e8 l                DISPATCH_METHOD,5 r2 ^% ]7 s$ m& C9 q6 J7 c1 T; T# l2 i
                &dp2,5 c8 h3 Y7 k1 C# U
                &var,0 u: E. m+ T) z: F5 h9 b& _" V
                &ei,# n: ^* u$ N1 T, F
                &uiErr);, b3 l. f# d6 @- E* {6 F: ^# ^

9 w' ?0 S8 `# W: t+ V  W+ [        SysFreeString(topicStr);: V; c& [+ P: L! I: N- Y! P
        SysFreeString(itemStr);
% c. v5 |* G7 w; i& t  k7 c& ^请问该程序是获得extend里面的哪个值?
5 i/ @3 w! {8 Z! k% g* @7 ~  x如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-7-17 01:03 , Processed in 0.011386 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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