设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8386|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:# T: c$ n4 L7 G7 u4 w' `' R
Name = (WCHAR *) L"Poke";
3 B1 z. w* g% ?1 }% p: x                
7 S+ _/ t" W+ D( h' r( {5 ?( t( L        hr = m_pDisp->GetIDsOfNames (
* G6 a1 b& B( `: K3 N/ P                IID_NULL,                                // reserved
0 N4 d9 M1 r& R1 \                &Name,                                        // Array of names to get IDs for
$ o/ C- b" t, A. E: }8 p9 J                1,                                        // # of names in the array/ o. n: |: i5 v% [7 P
                LOCALE_SYSTEM_DEFAULT,        // System locale
- e1 K# |' r( r6 f4 ^$ m; z/ a: M                &pokeID);                                // Array of IDs to fill on output
% y; r8 Z. P" j$ \                        + H- m  A! G4 f+ a4 W6 n
        if (hr)$ f. o5 Y2 r' d2 k5 V6 _
                {
5 U3 }! [- T% T- S) V1 E5 j                MessageBox ("Get Poke Unsuccessful");' c# w" _. v7 X; j) v
                return;
/ s3 ]/ ~" {) e' e                }* O+ V% }% m5 }2 N. ~  [( C( G
  ^+ k  D8 f4 ]. c- g
/**************************传递数据给extend**************************************/
* Y' `  y/ Y$ x$ G& N        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);1 p1 x* K% ], A; m7 O# H6 X; G
       
. K1 U& P. x9 T+ [5 S  O' g/ O         valueStr                                 = SysAllocString((WCHAR *) L"1232");' q1 f* x: o/ g, p4 F
        VariantInit(&pokeVariant[0]);
% |+ A+ g8 ^  ]        pokeVariant[0].vt                 = VT_BSTR;" ^( h' r0 b% _6 x+ w
        pokeVariant[0].bstrVal         = valueStr;
$ Z- X2 T  d2 v; y
8 n" }, N" Z# q; V         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");) r$ n+ v/ c; `; d1 d/ _% _, x
        VariantInit(&pokeVariant[1]);
; x1 h' E# y# Q/ t! [* @        pokeVariant[1].vt                 = VT_BSTR;
$ z' g7 s% d  S$ _  N+ ?4 {        pokeVariant[1].bstrVal         = itemStr;4 B( t! U2 z1 I6 `* }
) A3 ^5 Y* C6 d$ ~% V" S9 z8 n
          topicStr                                 = SysAllocString((WCHAR *) L"system");5 c8 z+ K, ^% O2 A2 E9 P; A, g
        VariantInit(&pokeVariant[2]); 9 _! Y1 H" [0 K4 |. B+ N  V3 `3 T3 K( R
        pokeVariant[2].vt                 = VT_BSTR;
3 z1 m; O4 W9 d: ^% c' v' @: L- D# L6 {        pokeVariant[2].bstrVal         = topicStr;
8 Z3 k8 g& i  h$ _+ I
9 c0 h$ Y# [4 U* \/ d1 C//        Set the DISPPARAMS structure that holds the variant.  A+ ~( `; `. h/ r
2 |! u5 k7 H7 F6 w
        dp.rgvarg                                         = pokeVariant;
" }7 h" l) U. S        dp.cArgs                                         = 3;% ]! T' x8 S' u( E' n% u) \0 w8 \
        dp.rgdispidNamedArgs                 = NULL;
1 G; ^/ k3 G% ?1 u; y" i+ B1 a4 H        dp.cNamedArgs                                 = 0;
5 z! Y7 x4 S- D# B5 }6 A, l! _& x, q& @% v; O! S5 q/ \
//        Call IDispatch::Invoke()
; C* {, A# _8 U8 m  b5 ?! f
% u0 p4 I7 B: I3 O        hr = m_pDisp->Invoke(/ f, T& D- n6 n: ?
                pokeID,
( j' U2 E* L' O0 f4 I$ J% J% z" t                IID_NULL,) w! y' I& O" N! c1 e
                LOCALE_SYSTEM_DEFAULT,
7 z% s) Z- ?* i+ F$ \9 _: ^# B5 ~: l                DISPATCH_METHOD,
( X5 k! ?' a/ D                &dp,: y/ p  K. d& V, W2 p/ S
                NULL,; U$ B9 S; v$ H. s' r( j7 w
                &ei,+ Y4 t7 g( K" ~6 S# Z3 S
                &uiErr);' j* q1 E1 J9 g4 O) J; `, H
4 i$ f$ u: v6 W9 W4 e% M4 T/ k& a" j
        SysFreeString(topicStr);
/ F; {" G( m0 Q; F9 W7 G        SysFreeString(itemStr);3 J" {$ Z2 e+ T. M" [6 Z
        SysFreeString(valueStr);
* Q8 e+ ^! a% h6 G8 ]  \, Q+ {
6 s$ t1 k* |  r# B% M$ @2 @# m4 Y; E现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
3 M, h( |; [  Z0 V1 v2 m% g此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????/ M0 j9 w" N7 l

8 @. Q, }2 [1 X4 W" B/ U" L3 Y9 v2 [2 }/ F, z" Z1 i
2.这是request的程序
/ `3 t8 L2 J8 F/ R//  Request a value from Extend
  i' S0 [& P: M, S//% E7 d4 F0 f; F$ C
//        Initialize the variant that will hold the BSTR.  Set the variant's
' l& z9 O. F) W+ g//        type flag to indicate the fact that this variant holds a BSTR. Place the, @. s9 l- R& x& T3 `' P" P) L
//        BSTR into the variant structure.8 f: A8 r7 Z2 P# a& `1 m
" Q, ?+ J: W$ `6 R+ g/ W
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
5 N" J9 c$ j) C4 Z1 W% j4 C6 ^. h       
/ I5 Q# X5 J( G, v* N) M6 l3 U         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
, G9 J: {2 f1 u# K        VariantInit(&requestVariant[0]);
* Y/ j6 |2 u3 m# T: D: y2 X- k! E& o! O        requestVariant[0].vt                 = VT_BSTR;
2 d& B8 x; L# G% C. u  i        requestVariant[0].bstrVal         = itemStr;
! p/ F) E1 G" `2 g+ b; u+ s: y
# E1 M5 n- Y! l2 b" Q  c, K8 U+ }0 Z          topicStr                                         = SysAllocString((WCHAR *) L"system");7 B; e* M- {! B5 N, ]
        VariantInit(&requestVariant[1]);
$ B4 l% @! m1 y& {* g        requestVariant[1].vt                 = VT_BSTR;- }9 g% ?: ^) r
        requestVariant[1].bstrVal         = topicStr;# Y0 S" |1 s: H1 F
9 N# }' e* Y) \* u
//        Set the DISPPARAMS structure that holds the variant.
8 h' V& Z1 m: g0 Y; \4 I
4 u+ e+ G% `2 V        dp2.rgvarg                                         = requestVariant;/ l! J( S) B6 z: O
        dp2.cArgs                                         = 2;0 p4 y3 ^$ O/ Q0 `& S" U; g- I
        dp2.rgdispidNamedArgs                 = NULL;
6 x' E! j2 m1 f- e. C8 \        dp2.cNamedArgs                                 = 0;) k* I" z0 x$ e& |

9 W1 }5 u# m; F/ p; D5 ]         var.vt = VT_EMPTY;
6 \7 }# s* x& B0 N6 s/ N3 t6 M4 I3 C$ C
//        Call IDispatch::Invoke()
, c/ ?. @: i9 z: Y0 d1 U2 _4 ]$ L
$ G6 y' L, Z1 Z  b; f        hr = m_pDisp->Invoke(  k( J5 m4 {& Q2 u  d- u
                requestID,
, |! ]6 ^; N" b0 s( T) E                IID_NULL,- n: m) l; k4 `/ I/ u
                LOCALE_SYSTEM_DEFAULT,
0 @& \( ]4 N( B9 o" T  ~& T. U3 }                DISPATCH_METHOD,3 {9 T+ n8 Q+ F( \7 S, i2 Y
                &dp2,
4 ]+ ]; k: }; {  N* J# |                &var,( |0 f% U6 q" W+ z) E
                &ei,
7 `4 [5 ?) z2 C% R- L& T& C                &uiErr);9 @/ P. O: X5 o' r+ t
( y$ H% K3 {2 }5 [# j9 d
        SysFreeString(topicStr);
; t. _" [/ H- t2 ^+ H        SysFreeString(itemStr);1 S: {- D( |  w2 @; z
请问该程序是获得extend里面的哪个值?7 U! D; r; B( e3 E1 i+ a- }& q0 Q/ T
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-2-26 15:13 , Processed in 0.031449 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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