设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13085|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:0 `0 i4 s3 h" K" g! Z" P5 q* u  C8 G
Name = (WCHAR *) L"Poke";$ N+ g" K6 t; J: ~1 X# r
                 ; U( P/ L' p7 L
        hr = m_pDisp->GetIDsOfNames (
  p5 d8 a2 ~# i+ X2 g7 G" k; _  J                IID_NULL,                                // reserved
; Y9 R( u. [) L$ S7 [0 p2 B0 w                &Name,                                        // Array of names to get IDs for
9 g- T& {/ h1 Z% R                1,                                        // # of names in the array
* O5 u) C1 t' F3 t- U7 r                LOCALE_SYSTEM_DEFAULT,        // System locale' N) ^1 T+ k5 b
                &pokeID);                                // Array of IDs to fill on output2 T; p; L3 z# ?9 l0 U' E3 Z/ ^
                        ) G6 S8 P5 l! C$ n  W
        if (hr)$ n3 A' Z% T. K( \, I. Y
                {
  W# o  I: w- Y% s; z) q0 _6 g9 L, N                MessageBox ("Get Poke Unsuccessful");
/ s  F  ^! k" F! _) e                return;5 N: Y' w; u' {
                }
! A# z! ?3 `2 j; t( R
9 Q. _' V1 |; Y( b* g2 |, }- r/**************************传递数据给extend**************************************/  ^; F6 A4 T. D1 M1 t: [$ y
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);$ F$ _( b3 B+ W9 p) V
        6 I3 N' x0 O% `. F7 j! ?
        valueStr                                 = SysAllocString((WCHAR *) L"1232");
4 E' |+ z; ]8 X# E# u+ g        VariantInit(&pokeVariant[0]);
  X2 R6 T5 Z6 ^+ z" c        pokeVariant[0].vt                 = VT_BSTR;4 f2 B  B3 M0 `2 M
        pokeVariant[0].bstrVal         = valueStr;
# o" e4 t$ {% S" t; ~( F1 i6 g
0 e$ f4 N, x( j, I         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");1 R. @4 J3 M9 \7 l  p
        VariantInit(&pokeVariant[1]); / r( e+ s- S! s+ J* B8 y- H) g
        pokeVariant[1].vt                 = VT_BSTR;7 Z' I- N% ~; G( P2 M
        pokeVariant[1].bstrVal         = itemStr;
6 u' `3 a( j5 ~& w5 W" f
0 Q/ y, t# @" e% M' k& Q          topicStr                                 = SysAllocString((WCHAR *) L"system");
* K7 i! h- A( ~* M% p* \1 }! t        VariantInit(&pokeVariant[2]); 7 z: p( _0 {! U4 o# V  V
        pokeVariant[2].vt                 = VT_BSTR;- C8 H, R& A! Y; d& @
        pokeVariant[2].bstrVal         = topicStr;
' ^. |. D" y$ b
8 L) Z. C( m! \% x+ J$ r//        Set the DISPPARAMS structure that holds the variant.
  s1 ^: }5 W& b, y6 w2 W! M0 V6 Q9 E, V4 W- M4 ^& p
        dp.rgvarg                                         = pokeVariant;
0 {  m: w6 G9 U' `- ~( \        dp.cArgs                                         = 3;
1 x2 l) k7 n; Y1 b+ C: [: R        dp.rgdispidNamedArgs                 = NULL;
, ]! m+ R& M* T* M: n6 m# Q        dp.cNamedArgs                                 = 0;
- k. G0 d* c) V' x" y! F; `
! L# A( ~% j1 P0 H//        Call IDispatch::Invoke()( \# c: l) y" i, v: b) |8 l: W& K

+ J3 G$ ]) W$ N6 s6 A5 O9 C3 o        hr = m_pDisp->Invoke(, [2 `" U, ?2 \% L1 q9 t& c% \
                pokeID,
* J0 y9 B6 I. E& t/ ~7 w                IID_NULL,. [* t" h# z/ d- n
                LOCALE_SYSTEM_DEFAULT,: ?" c: F4 j2 V" w
                DISPATCH_METHOD,8 T, A8 F+ R5 |
                &dp,
% g. ?  `2 J( ?0 @, W. Q1 S, S                NULL,- y& T- X. i9 z1 `* X
                &ei,
1 w7 }$ L7 ?9 g1 _3 S                &uiErr);
2 [  S. }+ G' ^. `+ c' q9 q% G
- M! b+ M4 Y9 P        SysFreeString(topicStr);
, L7 l. |+ d8 t: }) W3 T0 U        SysFreeString(itemStr);
* }  z8 A& ?) T9 O. D        SysFreeString(valueStr);
' P) m% q, ]: @+ P( h8 x3 [
9 h$ ]$ G/ c8 g: W* O4 Y" U5 Q现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???  f% j8 k; e( G# j! T  n
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????  ^, l, f. c8 V4 ^
' O9 y0 t$ G7 R' l; d

0 S( l4 T5 z  c; z' b: Y: j( S2.这是request的程序
9 D5 Z: V( s7 F//  Request a value from Extend+ M2 I' e/ ]& P  F  _
//: Z, p8 n5 |# u( G+ F5 U3 C
//        Initialize the variant that will hold the BSTR.  Set the variant's1 U0 I+ O+ B5 S( f! e- ]
//        type flag to indicate the fact that this variant holds a BSTR. Place the3 c3 y0 L; C. s8 n" U8 t# ~
//        BSTR into the variant structure.
' y3 C7 R2 C6 K' G4 H
! N, ^, `7 k8 _; E4 a        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);6 C  }8 J, ?6 U3 M
       
4 @3 J7 u2 l, ^5 `, ]2 |: e         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
/ c+ X" f, v) j- N        VariantInit(&requestVariant[0]);
; S2 P  E3 A1 x7 y1 |        requestVariant[0].vt                 = VT_BSTR;
+ _: ]$ T2 P+ ?3 E; r# Z        requestVariant[0].bstrVal         = itemStr;
/ O$ w# r3 ]9 R$ I2 ?0 l
7 }: G5 U- H1 p  s7 c- D6 ]/ H          topicStr                                         = SysAllocString((WCHAR *) L"system");. @5 a9 t1 ~  ?% P6 t' }" B( ?2 O
        VariantInit(&requestVariant[1]);
7 H: e' [) u/ ]8 H+ e0 K. [        requestVariant[1].vt                 = VT_BSTR;+ F5 h5 {2 t$ U, t+ `* u
        requestVariant[1].bstrVal         = topicStr;& i( R- K8 Z- I( r* Q  Z+ J' H

7 M( ]" E* b+ s4 N7 Q( ]//        Set the DISPPARAMS structure that holds the variant.* T3 c/ y& n, q6 ]( ^

4 |. Y8 ]- p" S, C5 U        dp2.rgvarg                                         = requestVariant;
9 S& N: b( {( p: C' z        dp2.cArgs                                         = 2;7 |& O3 r7 u! G. D+ `, U
        dp2.rgdispidNamedArgs                 = NULL;
8 W( i; k' `2 R( h9 r! f        dp2.cNamedArgs                                 = 0;
/ d" r6 r, x4 d* y$ r2 G1 |) \
% W' L/ ?4 N9 y% D         var.vt = VT_EMPTY;
# ^# E+ }" ~5 m9 Y0 k2 ?) q6 G8 T
- E; e; u* H1 f: Y5 T2 t//        Call IDispatch::Invoke()8 s  b: x4 i7 L0 y5 E5 y& a: D
7 B7 L& ^1 c1 A2 e+ d: V
        hr = m_pDisp->Invoke(
+ O& P& e& g! D: O; i                requestID,
& N$ x/ ]6 O0 V" `4 ?: `                IID_NULL,
4 V; {1 h: W& m# a6 c                LOCALE_SYSTEM_DEFAULT,
* h+ U& S* d# E7 E2 r/ N6 u                DISPATCH_METHOD,# U* R, w' F, @* D) ]
                &dp2,* o- |  N$ R# [
                &var,$ g+ s7 L- l0 V) C
                &ei,* x7 [( F7 w1 s) q2 p* S
                &uiErr);% D$ {9 I$ U2 t. e, ?8 Z

6 p7 R6 u, G' E; I+ O6 H        SysFreeString(topicStr);
. K& [# F# {/ R: n4 W) j        SysFreeString(itemStr);9 D1 U* Z% s4 W8 p. K7 L6 ?! Z% v
请问该程序是获得extend里面的哪个值?
) p6 S1 V2 w+ |' `* o如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-9-11 23:13 , Processed in 0.015360 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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