设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8179|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:2 J3 _2 h( }0 O* Q
Name = (WCHAR *) L"Poke";: a, ^+ @- E$ E7 ^
                
6 V( ?2 I: u# u8 d% ~* @% G$ G        hr = m_pDisp->GetIDsOfNames (
, X' _" g5 {3 a1 w! D                IID_NULL,                                // reserved. m4 ~1 n9 b2 T0 M
                &Name,                                        // Array of names to get IDs for
1 H  f2 C9 X: E' d" l                1,                                        // # of names in the array
, P; p8 n) Y" X" K7 v                LOCALE_SYSTEM_DEFAULT,        // System locale
) ~0 W1 Q8 a2 O, \& _1 G                &pokeID);                                // Array of IDs to fill on output' _# B) @& n0 J, t
                        8 F  D! B! F/ c2 ]& N1 n' P* N. G
        if (hr), v0 e$ _  j3 N, q; G* M" y- |
                {' K7 N0 Z, @4 B8 Z
                MessageBox ("Get Poke Unsuccessful");
/ ]9 f2 [! t5 M8 m+ F0 y                return;+ F1 C7 \  m1 f# @) K$ i
                }
. ^! ~7 w" x8 R& T3 I- L% Y. s0 z/ \& g6 I7 R" F, X' G8 I
/**************************传递数据给extend**************************************/
0 T/ b0 q5 B% [1 w        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
& [9 z* E0 e) m4 U7 O  T       
9 ^  }. j+ G( s) |         valueStr                                 = SysAllocString((WCHAR *) L"1232");/ b) ]! n  ?8 i5 k4 \
        VariantInit(&pokeVariant[0]);
6 q1 `. G) [: V        pokeVariant[0].vt                 = VT_BSTR;
% M. P. L, t4 J5 D" C+ L( u4 c        pokeVariant[0].bstrVal         = valueStr;
, S  r: N2 Z/ s1 ^
# n6 A, |+ {) J; D+ h) C: a) N% b         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");) _3 F: X- _. M* o( L9 ], N4 W
        VariantInit(&pokeVariant[1]);
& @" Y4 n. Y6 P/ h0 |2 M% \) [        pokeVariant[1].vt                 = VT_BSTR;
3 l7 @# C& b/ g) O8 E        pokeVariant[1].bstrVal         = itemStr;4 _. H$ }( X- U( G, Z9 S

, E7 k2 l# b7 ?7 v( {          topicStr                                 = SysAllocString((WCHAR *) L"system");* X  Q5 r6 O. W( q7 f
        VariantInit(&pokeVariant[2]); 6 Z$ P0 Y5 i- \7 T' K/ R
        pokeVariant[2].vt                 = VT_BSTR;6 N- v! U4 c; P, x* b8 C
        pokeVariant[2].bstrVal         = topicStr;
4 o+ y: j* v; F6 L9 `: _, m, {4 K- K* Z
//        Set the DISPPARAMS structure that holds the variant.# w' h5 u3 i$ o" I; n

! `! k- C0 v: k% X- U' L        dp.rgvarg                                         = pokeVariant;; t0 X  b4 s# Y" c6 e6 x
        dp.cArgs                                         = 3;* X  `, s4 L$ d5 E% P0 m
        dp.rgdispidNamedArgs                 = NULL;
# G: a9 W7 `) e  a5 v1 F        dp.cNamedArgs                                 = 0;' k3 t$ u' k, e1 B. b# I( ?' {

  ^: c& r3 f  p" p" ~& d# f# [  [//        Call IDispatch::Invoke()4 w0 |7 s" i8 _" \: T

2 Y5 V7 [6 o4 L% f7 N6 Y7 v        hr = m_pDisp->Invoke(# Z6 d# g4 M( Q. ]5 }( ?
                pokeID,
- K* \, i; {2 u8 x* E                IID_NULL,
! ~1 }6 Q2 r" d  y: [                LOCALE_SYSTEM_DEFAULT,
+ q: W4 e* c1 @3 N                DISPATCH_METHOD,
- ], _7 Z: W: @+ X& E                &dp,7 d- A' g: P% d. `- U) `$ p
                NULL,: Y1 I7 P2 H* U
                &ei,
, f9 W  j. T" V( b& l% f                &uiErr);
7 _3 K+ ?' T+ t  }% h" f
. x# H7 D8 E& h5 m) _7 m% E  c        SysFreeString(topicStr);
) \9 I. Y. V) F! a6 Q        SysFreeString(itemStr);
" g( }# s3 Q9 Q0 b/ I3 I1 {        SysFreeString(valueStr);
8 h. u4 }& N3 J5 p/ P2 t( K& t% e
( {1 t5 |% R% l2 m& N8 X现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
' H& ]6 H, ^+ i6 s% ~2 R此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????5 M% U( _6 T+ `% _
- Z8 @: z$ x9 Y& S
  N! n9 Q, q4 w
2.这是request的程序
$ _7 |: {3 ^+ A! p5 ]//  Request a value from Extend/ L' x5 B, L  I& g+ z0 M8 [
//
% `  u9 L3 M2 q. k//        Initialize the variant that will hold the BSTR.  Set the variant's7 g; T7 U) [, L7 X: B/ [3 ^& a
//        type flag to indicate the fact that this variant holds a BSTR. Place the. i1 a% G6 P  R% l  g: O
//        BSTR into the variant structure.# S6 z( T, g# J' t( [' U) H& S

1 p+ v% K' N: I6 Z5 v        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
. A$ i" p  K  W8 K3 j0 o8 |  _  R        2 B: a# u" }0 l( m* j
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
5 @1 I) `6 S  U) f* Y3 V, k. w" K2 q        VariantInit(&requestVariant[0]);
# {* D( I' E, Q        requestVariant[0].vt                 = VT_BSTR;2 ~, B5 x0 O0 O1 x' G9 `1 ?
        requestVariant[0].bstrVal         = itemStr;
+ J' \. A4 F  V$ z% S( c8 r* N% q0 Y
9 v* |% g/ ~. D0 A          topicStr                                         = SysAllocString((WCHAR *) L"system");9 ^- U, i: X& l  p
        VariantInit(&requestVariant[1]);
% z/ _2 ]0 v- B* {4 r        requestVariant[1].vt                 = VT_BSTR;( u# `& N' I3 ^
        requestVariant[1].bstrVal         = topicStr;
/ s7 W! X9 D) _0 W# i6 I8 S: v: b* k* O) u. {
//        Set the DISPPARAMS structure that holds the variant.
9 C/ S% P1 b: U+ L; \. I) i* h
4 k! a- g) h8 H6 y2 U3 p4 {1 b        dp2.rgvarg                                         = requestVariant;
  l4 M0 k! I- i1 j8 Y1 m$ v. H& Y* \        dp2.cArgs                                         = 2;
7 a: ]' ^) [! o. o0 h" Z; F: _        dp2.rgdispidNamedArgs                 = NULL;
! l" h8 e/ S6 Y        dp2.cNamedArgs                                 = 0;" ]# k( ?  h# {" ^& F9 b- T

$ h0 m. z- R/ r  w         var.vt = VT_EMPTY;
" ~: I% S, a; ]  a+ V
/ E7 _9 t. }6 H//        Call IDispatch::Invoke()
2 [- b! y$ z' [+ j1 y9 l6 k+ n3 Y5 R' E/ _
        hr = m_pDisp->Invoke(
7 ~0 U6 m1 A% u- z                requestID,* c& K  f% D9 t% i
                IID_NULL,
2 S, k# F) q  E: @/ l" ?                LOCALE_SYSTEM_DEFAULT,
, u4 Z+ \% F* p* }5 }$ ]                DISPATCH_METHOD,: l2 I! W& h4 `$ P5 M
                &dp2,
2 E; u5 q0 T. c                &var,
( a' ?9 l8 L6 u( `8 Q. D- A                &ei,
2 O$ E7 c* P0 u+ w0 {  u                &uiErr);
# T3 U) F5 ?$ f$ f6 h3 s7 T) C, a  N4 f% b; p+ t
        SysFreeString(topicStr);
( q& b" L) t( l& \) r) ?        SysFreeString(itemStr);
! z) N. W$ l/ u请问该程序是获得extend里面的哪个值?- ]$ }) }6 \: m% B
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-2-18 05:46 , Processed in 0.015106 second(s), 13 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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