设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 6782|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:: ?5 n6 C! k# a
Name = (WCHAR *) L"Poke";
, }1 g/ |) l  v# [                 + |3 h) q% w0 ?2 d/ b) J
        hr = m_pDisp->GetIDsOfNames (
; ]0 D; v* @( i; }& v7 `& d                IID_NULL,                                // reserved8 h3 x4 e' g/ ~) u" X+ S& y) z
                &Name,                                        // Array of names to get IDs for
) v; Y4 {& X/ E# `! u: O7 u                1,                                        // # of names in the array
  R# m  f7 j3 a7 y/ T" i5 m                LOCALE_SYSTEM_DEFAULT,        // System locale
/ n- M1 {# }! U- L                &pokeID);                                // Array of IDs to fill on output
# n' P) c& o5 @6 _% N, h                       
- C' c/ k3 @1 H4 T! S4 P' Y        if (hr)
0 q# y. F5 C8 N) o                {  r, [4 j# e( k: q' o* G
                MessageBox ("Get Poke Unsuccessful");
# |! V0 H- b( ]. T+ O# Z                return;4 Z. D1 e0 \1 D/ @
                }# l. e$ z  k5 ~& ]0 v
9 o8 ?$ W9 C% q! p, ^
/**************************传递数据给extend**************************************/! c0 a5 O/ a& `: t5 R' }& G/ r$ E& u
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
9 p$ w, m& |  i4 _  T       
. A( b% c# e1 M( P* d         valueStr                                 = SysAllocString((WCHAR *) L"1232");
1 A0 c& m. m/ p  D* E! ~1 u        VariantInit(&pokeVariant[0]);
& q* g7 n+ C' v) ^2 f( z3 [3 H        pokeVariant[0].vt                 = VT_BSTR;
$ Y/ O" m& I  J1 ^* G% g        pokeVariant[0].bstrVal         = valueStr;# ^  s% `- L+ N% @
! {/ r$ N. h  m- C5 S" e. L4 ?- G
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");% V" b2 B0 T$ L6 N+ m" B3 `
        VariantInit(&pokeVariant[1]); ' x/ r( g3 D5 s+ m2 C9 o1 _
        pokeVariant[1].vt                 = VT_BSTR;" Q9 F" f. A# C! g; [
        pokeVariant[1].bstrVal         = itemStr;
, j+ ?7 t! |; N" Q2 {, K1 R
" T! u: U# v$ r$ a3 ~1 {          topicStr                                 = SysAllocString((WCHAR *) L"system");9 x9 a) n+ h$ l' Y
        VariantInit(&pokeVariant[2]);
5 x6 ]0 ?# Q# K, L& b        pokeVariant[2].vt                 = VT_BSTR;% t0 O# V$ u, G. i2 e
        pokeVariant[2].bstrVal         = topicStr;1 [( Q% V% f' r' P5 I6 Y6 T( B

4 ^  x- W% X' S  I, x8 \, P//        Set the DISPPARAMS structure that holds the variant.% {9 x! B% U+ A, V

. B# @& f' J/ r        dp.rgvarg                                         = pokeVariant;  u8 W# A, |+ N* z) u6 F
        dp.cArgs                                         = 3;9 F4 [- D: _+ f1 z) k$ M& z5 M6 d. F
        dp.rgdispidNamedArgs                 = NULL;
4 I) ?9 v4 w+ i. u        dp.cNamedArgs                                 = 0;2 l$ k# Q! l. Q, O

0 t( x2 d) a3 q3 R- N) d( z4 s//        Call IDispatch::Invoke()! |7 w) }( e- _, N2 i5 y5 w1 b
! Z' j2 R! C( n3 f
        hr = m_pDisp->Invoke(7 t* X7 G$ z2 [( O+ r
                pokeID,3 `2 o8 \& S  a8 h! A/ H9 ?) C
                IID_NULL,
! H* N4 `* A7 Z' E                LOCALE_SYSTEM_DEFAULT,
  h3 }0 ]. t& \! P8 J( H                DISPATCH_METHOD,
" H& P3 w9 q% V0 l                &dp,; L. f5 I1 P6 i+ |& |) i
                NULL,/ f$ H" {& }+ c5 _* k; Z# h- o" b
                &ei,0 ^2 m* d9 N- F8 e. F4 E. P
                &uiErr);
- s7 I7 D# U4 e0 h& w0 \
9 H' T4 e0 M' I' F; q6 U* _        SysFreeString(topicStr);# J0 P4 s& p3 `8 @; d1 v$ C" i
        SysFreeString(itemStr);
1 r* y  Z9 o( Q0 n$ g1 \1 k- K        SysFreeString(valueStr);* ?; F+ g/ p; a+ u/ V! R0 J

7 s, k2 D6 ]* C% E  L现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???# L$ {) [& C3 I$ G. L$ p" X
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????0 _* x0 p- d# u6 x
& q: P: T; M. W0 Q) ~

. V% Y4 `* D' r2.这是request的程序! D$ l# j+ O0 ^) f
//  Request a value from Extend: u: B5 ~2 U$ t3 @
//
7 K2 Q8 u0 b6 R  W8 ~//        Initialize the variant that will hold the BSTR.  Set the variant's# i9 t$ o9 X' J! ]: h
//        type flag to indicate the fact that this variant holds a BSTR. Place the
$ P0 N6 }' `' ^( R6 ^//        BSTR into the variant structure.
3 M/ `4 X2 p3 G- [  ~; }$ |& @& I
/ f3 J' t; z) F) V        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);6 Y2 x1 J2 w8 o* Z4 R& I; B. p/ D
        : a* y/ _) D6 d, P/ l8 O6 H3 P
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
1 L7 o7 m! _  f. }4 K4 J, e/ w8 t        VariantInit(&requestVariant[0]); $ b3 ?- u9 T/ ?5 K* {6 g
        requestVariant[0].vt                 = VT_BSTR;
9 A- G; U! u2 L$ I        requestVariant[0].bstrVal         = itemStr;
# x% T, w! z$ K( r
- O* j7 @$ c% r          topicStr                                         = SysAllocString((WCHAR *) L"system");/ u$ _7 r' @; I: x. y
        VariantInit(&requestVariant[1]);
9 T9 z# c1 b/ R5 a2 L7 S2 X! F9 Y& r        requestVariant[1].vt                 = VT_BSTR;
8 G1 k; o# N8 [( P        requestVariant[1].bstrVal         = topicStr;
/ b; j% `" [& I% b5 _1 M1 `2 u" g( [2 H
//        Set the DISPPARAMS structure that holds the variant.
% U& x& a5 [; H2 e. T
8 u+ @$ o6 E2 s0 Y        dp2.rgvarg                                         = requestVariant;: U$ p  \4 C& s$ N) ]3 {: ^
        dp2.cArgs                                         = 2;
$ Z$ [; |' ^# a' Q# x8 C2 S/ e        dp2.rgdispidNamedArgs                 = NULL;
6 _2 u) R. G( E; ]4 |8 C+ V        dp2.cNamedArgs                                 = 0;3 [1 Y0 j5 o4 B3 ]- |5 j9 H
6 |& K9 h& V% B6 n7 y
        var.vt = VT_EMPTY;
! K' d0 e6 }& R+ x3 C7 v/ f) H2 j- \. j1 H& x: E
//        Call IDispatch::Invoke()) x) ?, x$ i5 B; v* f$ M

) Q' j2 R$ `2 ~* i: V; ?% _6 f        hr = m_pDisp->Invoke(
& D9 P% ?/ N. |! w3 T4 r  M. l                requestID,- J( L- a9 U" M) e0 `  {
                IID_NULL,) j9 K' f4 r6 v7 u( c5 u+ _
                LOCALE_SYSTEM_DEFAULT,7 c# v7 X. M( F  [0 J# R, T/ g# q8 D
                DISPATCH_METHOD,( c8 Y5 K+ [! j& r% t
                &dp2,
$ m9 E& R! Z- X) e) X$ s) c% w                &var,; q+ Q; e( o: i& w* r
                &ei,
: H3 f5 e0 E0 }% K: {) _                &uiErr);0 T# Z4 L: e# b, [
6 R  u8 C& T/ r# P6 ~
        SysFreeString(topicStr);6 }8 {8 k6 M) [- k" ~7 f7 I
        SysFreeString(itemStr);! ]7 v( t; u6 O1 F
请问该程序是获得extend里面的哪个值?
7 _3 X$ f- \- h2 f如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2025-12-2 19:22 , Processed in 0.014154 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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