设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9148|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:* K4 O! O3 ~) i& Q* Y
Name = (WCHAR *) L"Poke";( t5 s1 [: b3 i' y5 \3 H
                
1 Q1 ?6 M9 U, T8 E. \2 s1 F% \        hr = m_pDisp->GetIDsOfNames (
6 p: M8 Z! A7 n* t7 M                IID_NULL,                                // reserved
* i) B6 Z1 B* H+ x& h                &Name,                                        // Array of names to get IDs for
4 q! Z1 T  n! G, @: P                1,                                        // # of names in the array5 A9 b7 ~- g8 _$ Z$ y
                LOCALE_SYSTEM_DEFAULT,        // System locale
' b, r3 d1 v. S                &pokeID);                                // Array of IDs to fill on output
7 x7 G6 A& q! E' V; i                        / C2 U. @6 ]' p3 K4 `$ C
        if (hr)) P3 @2 }* N. v1 p. D
                {, r6 f5 Z+ _1 Q8 \4 b4 c  C- c) Q
                MessageBox ("Get Poke Unsuccessful");  z3 e, V; L6 ]- t  E
                return;3 \4 E0 E. ]) S; z9 ~
                }
4 Z7 q3 N$ D5 o% |
  W7 v8 s% p0 @& q! P3 K% K3 C/**************************传递数据给extend**************************************/. h( c' z' V3 s  ?4 K9 F# j% m) ]
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);5 p4 H; P0 A5 |( Q7 f, {$ c
        4 r5 M' q2 \' Q1 j. e
        valueStr                                 = SysAllocString((WCHAR *) L"1232");
! |/ T3 L1 o. N3 I( h/ J9 J: c        VariantInit(&pokeVariant[0]);
% t* L7 m" v; i& P# S" O/ ?  S        pokeVariant[0].vt                 = VT_BSTR;
  K+ L" E. O9 _' b; m* X        pokeVariant[0].bstrVal         = valueStr;
1 [" P$ G5 O* p8 C; {  |
. l* c8 V. e2 Q, ~         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");) A4 X( q3 \- \6 F4 w- A' P# F# P
        VariantInit(&pokeVariant[1]);
% i' E3 }5 s8 ?4 q& P: J5 R; P# x4 W2 A        pokeVariant[1].vt                 = VT_BSTR;
! V0 |5 I* x9 f3 c        pokeVariant[1].bstrVal         = itemStr;$ y8 P: w5 K" ^; E( V
$ w! x. J$ N1 b6 R; k8 j
          topicStr                                 = SysAllocString((WCHAR *) L"system");
: }) s- r! B0 `+ b        VariantInit(&pokeVariant[2]); ) X. j0 m: d3 D6 p
        pokeVariant[2].vt                 = VT_BSTR;# @2 \' `! o  I! n! Q
        pokeVariant[2].bstrVal         = topicStr;
* j2 U2 x0 [) H9 b1 a# f+ k+ _
//        Set the DISPPARAMS structure that holds the variant.
. `; X$ t, L- ?; n7 L+ Y0 Z* ^, [* g
        dp.rgvarg                                         = pokeVariant;1 z4 b- g' [* q7 C/ z
        dp.cArgs                                         = 3;4 D* c' v% Q( ?2 `; u
        dp.rgdispidNamedArgs                 = NULL;
, r8 m8 {+ E' {6 m3 ?, M! `( U        dp.cNamedArgs                                 = 0;
% `+ V: q- D6 n/ \  p0 L) Q  K+ H- N% y* T/ c
//        Call IDispatch::Invoke(): S! c8 p4 A6 I5 c3 u
( K* H! k8 ?1 P1 T
        hr = m_pDisp->Invoke(
1 T2 t3 {5 T8 ]4 s4 C& T                pokeID,
/ M8 T" Y0 a! D$ g' d  ?                IID_NULL,% j* E7 F/ A9 A7 D# s5 ~
                LOCALE_SYSTEM_DEFAULT,0 Y. i' P. a  g
                DISPATCH_METHOD,0 A  w; S" r; p, L0 N
                &dp,) B4 B/ Y% Y2 y: i+ i& k5 e
                NULL,
+ w7 @* ^# B/ N% ?. D0 ^0 F                &ei,
8 v- z& p% X/ }2 x! f3 b                &uiErr);% \) n1 S2 \0 b* r
0 b5 Y3 Y/ r4 v" o; ?
        SysFreeString(topicStr);
. B8 |1 x+ M9 a( D+ m. T% n        SysFreeString(itemStr);: a1 N3 L$ A! R8 b* m1 m' l7 \
        SysFreeString(valueStr);4 t# b! w2 x2 @7 b& ^
/ {" {. _( O+ x0 a5 x& Z5 D
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???$ S+ a2 @, |" k4 \
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
9 Z' z. E( v3 m7 J+ g7 U& J" U' z! W% D
; I# S8 [  h% q  o- q
2.这是request的程序# |/ r- ~% j! W, y  u. K
//  Request a value from Extend# D! u) w$ o0 ]- _& Q% X. K
//( |) A% r# g( B+ B9 W8 g9 [
//        Initialize the variant that will hold the BSTR.  Set the variant's0 ]9 W1 E/ K( z/ w3 v% l, |7 [
//        type flag to indicate the fact that this variant holds a BSTR. Place the
4 D* c8 e) t7 @6 q% _6 w" v1 j2 }//        BSTR into the variant structure.
6 @! q, d( m5 a" P2 t$ q* U+ m, F, E& H' z( d. p& E
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
7 [% g- b8 Z# G8 T/ l        5 v0 p* V3 v5 ]7 [' _( l
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");. o2 y' B& l- J8 P
        VariantInit(&requestVariant[0]); * o6 r; |. Z, a
        requestVariant[0].vt                 = VT_BSTR;
% l" I* x5 g2 `9 N: O2 y5 l        requestVariant[0].bstrVal         = itemStr;$ L5 U1 t% D7 y% G6 y

5 H& b& V  a7 c% z          topicStr                                         = SysAllocString((WCHAR *) L"system");
/ @' b) Z7 G* X( J2 r        VariantInit(&requestVariant[1]); ; ]& B; V  E" S
        requestVariant[1].vt                 = VT_BSTR;
7 |5 p) g( ?' w$ [        requestVariant[1].bstrVal         = topicStr;
7 @7 [# z- x* A5 I* U7 k
8 X5 D$ a& F- P//        Set the DISPPARAMS structure that holds the variant.6 B. x7 Q: W) O% q+ A, Z
' [0 @( d6 r& }  r& _9 ?+ |
        dp2.rgvarg                                         = requestVariant;3 u$ L5 ^4 L) b$ `' B2 ?
        dp2.cArgs                                         = 2;( ~8 h5 Y( T9 }  z# @) [
        dp2.rgdispidNamedArgs                 = NULL;5 M: |; Q+ p1 K& L, f$ M6 K2 E
        dp2.cNamedArgs                                 = 0;6 J2 N) D" ^+ G4 l0 J3 z

/ M( e3 C6 k' E         var.vt = VT_EMPTY;6 |' a& E  Q$ G& |, U, f% s
: H, `; f# j9 g0 C9 Y# h/ y7 l
//        Call IDispatch::Invoke()( \( G  ^; `/ A0 ~- G8 N

! v5 z" K8 e6 a. K3 q: Y( j        hr = m_pDisp->Invoke(
- \8 E# C: i. `& r                requestID,
, N; p! D3 @3 @6 M3 A) u                IID_NULL,
4 K0 G: A2 _/ ]& f' b                LOCALE_SYSTEM_DEFAULT,
$ t. F0 @2 E4 [( [3 V# O0 i# T                DISPATCH_METHOD,
( T8 F3 q6 A+ Z6 K% s( P9 ]                &dp2,
" S0 }0 B* B. I0 h( w0 Z                &var,+ J/ t) {% J1 z
                &ei,1 u1 k% i, J- H9 j6 q4 c
                &uiErr);3 F8 @7 V$ j1 C3 o2 p4 ~6 i1 V2 ?! R+ ?

& R' f- V. z, J9 ?! F        SysFreeString(topicStr);
' ^. y2 C5 a4 K9 E0 F" c        SysFreeString(itemStr);# O& c' _  C1 O5 O/ W, [+ i8 v
请问该程序是获得extend里面的哪个值?
5 i4 e! e) Q# T. y如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-4-5 00:25 , Processed in 0.013827 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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