设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12446|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:. l6 R1 a9 ^4 {  Q
Name = (WCHAR *) L"Poke";
# D8 M2 j) u0 }: Y( U! A                
' W/ j1 V3 z6 \! @$ a. }3 |        hr = m_pDisp->GetIDsOfNames (# \( K+ s- J3 g, V) f# \3 b) R
                IID_NULL,                                // reserved0 B- Z. c8 t- ?  _: @# b2 G
                &Name,                                        // Array of names to get IDs for: X5 U$ w) f0 z. U& K1 w
                1,                                        // # of names in the array% S2 \2 C$ x9 u9 w
                LOCALE_SYSTEM_DEFAULT,        // System locale
0 c5 B  ^5 g8 g1 Z, L6 ~/ W9 U                &pokeID);                                // Array of IDs to fill on output- c) S( J. k3 a5 D& n8 W9 Z6 T
                          S  C: A! Z! x! ^( }+ ^0 w
        if (hr)
1 v* H' P% r8 c0 y+ f                {+ a$ P4 t9 G$ b/ y1 U0 c/ Y
                MessageBox ("Get Poke Unsuccessful");! H% n% j+ S1 N' p8 I; s% y
                return;
8 h1 [# w  w  y9 J                }
+ i- H$ c; q6 |- U4 p( R
7 b% M, R! ~' o: l: C5 l/**************************传递数据给extend**************************************/: z) U; l* @# p) k1 |) G
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
6 h1 Q; f9 f* [" `  H       
  i+ X" N7 T8 n# m' s, }3 i         valueStr                                 = SysAllocString((WCHAR *) L"1232");
" I& x8 `4 J1 f. C        VariantInit(&pokeVariant[0]);
9 ^7 ~1 o7 h* v+ Z# F        pokeVariant[0].vt                 = VT_BSTR;# E9 m; y% L$ B1 E) V$ L
        pokeVariant[0].bstrVal         = valueStr;
5 _7 T/ B1 u6 w
. T* F2 J- g$ x         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
& g: V8 S8 c% G7 Z        VariantInit(&pokeVariant[1]); ; }% B2 O# M9 V% M, y# ?
        pokeVariant[1].vt                 = VT_BSTR;5 S0 f" a" t( c3 D0 J" z
        pokeVariant[1].bstrVal         = itemStr;
: A$ Y' L+ ~- S8 a: X" j
7 E- Q) R3 C4 y' E3 E1 h! [3 J          topicStr                                 = SysAllocString((WCHAR *) L"system");- s3 N7 a  |; u: p! [
        VariantInit(&pokeVariant[2]);
4 [! j) U# s' I" `2 {3 f( \/ t        pokeVariant[2].vt                 = VT_BSTR;$ H: P4 S1 f" D, _. G8 M9 ]( M3 R
        pokeVariant[2].bstrVal         = topicStr;5 C% e7 u" p% o* ~
, v! \% y; |+ s9 t9 T) B4 [
//        Set the DISPPARAMS structure that holds the variant.
' S/ g, j  E5 p3 s& Y. H) X8 ?: y' O
        dp.rgvarg                                         = pokeVariant;9 ~  D# _, S, W+ a/ X4 O0 M
        dp.cArgs                                         = 3;# _1 E1 a' _2 V; N  C- I
        dp.rgdispidNamedArgs                 = NULL;
% B' P+ u; B. V; u) S9 e        dp.cNamedArgs                                 = 0;4 `) c7 v1 h9 H3 e: p

% X, {+ J! ?( J; b/ h3 t, k" E//        Call IDispatch::Invoke()4 a+ `6 N" z% c% x0 m( ^
8 K' y3 Z' H7 _
        hr = m_pDisp->Invoke(
. R+ f4 [2 P2 e! w$ |                pokeID,
" F6 h/ t9 a9 n- W$ p( S4 k                IID_NULL,
4 \# A3 v* G; E% F1 Z/ O                LOCALE_SYSTEM_DEFAULT,7 D- H* g/ H5 j
                DISPATCH_METHOD,
, C: j& n; v; z7 Q; k, ?  o8 u                &dp,1 f% @3 U! R$ @
                NULL,
, L' H" W1 W8 z& O: ]& ^: E$ ~                &ei,7 g/ ?+ q4 V- ^& {! A
                &uiErr);! I2 b8 c6 u& ^5 u

/ Y4 V5 y/ ?( i6 w; g. N. O        SysFreeString(topicStr);0 ~1 K0 J. t' f2 ~8 Z
        SysFreeString(itemStr);% s" o, T: C, F
        SysFreeString(valueStr);! f8 E; `  J* U6 R
# Y  W5 M2 c$ j! l. q  K7 r* D% a
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???% H) _9 l5 O; u5 e
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
  q0 X: a4 J- p& Y$ ^& ^4 v' [: j# Y# _# h' u4 u- Z  ?6 ^
# |) a* t9 e3 ]  S
2.这是request的程序+ Y3 L' \8 J* v( t  h
//  Request a value from Extend
9 a2 Z; Y6 I9 T  z1 t8 N//% ]) w" `5 H, w/ |0 M, \# R2 v
//        Initialize the variant that will hold the BSTR.  Set the variant's
2 Y7 P# N$ T; T//        type flag to indicate the fact that this variant holds a BSTR. Place the, O3 J6 @( P8 A3 J' G
//        BSTR into the variant structure.
; W, ]0 v" }& ~7 P, G# L
1 [* @, s; y# m- P- L        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);4 P! j' _& \2 n2 x' \( c# I
       
% l7 D$ d; @( ?: M; R         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");, O4 N+ x# I2 f% m" }% R0 ~3 @* ?* s
        VariantInit(&requestVariant[0]);
7 e2 {7 `5 e* O        requestVariant[0].vt                 = VT_BSTR;1 K! l% Y; ~' O7 O9 w+ i6 R: ^
        requestVariant[0].bstrVal         = itemStr;
% _- N* \$ g. M' l- \
- t" O& O( y* F) c8 l6 i          topicStr                                         = SysAllocString((WCHAR *) L"system");
# b: S9 K( x/ m+ h) S        VariantInit(&requestVariant[1]);
+ e; y* P4 ]% l7 R5 N5 i& C        requestVariant[1].vt                 = VT_BSTR;
; Z" p9 ^5 l5 r, w1 H        requestVariant[1].bstrVal         = topicStr;
1 R5 B' d* e/ j% _! ]
% H& s. \8 g8 H) o3 F6 i  p//        Set the DISPPARAMS structure that holds the variant.' \- A9 J: K% \" g3 H3 m

, H' B0 L$ o( C, m        dp2.rgvarg                                         = requestVariant;3 `. y1 c2 t! Y' J
        dp2.cArgs                                         = 2;
  f6 C" _& g# [0 B) C7 z# N        dp2.rgdispidNamedArgs                 = NULL;& a1 ?2 y7 V( `' N, j* A
        dp2.cNamedArgs                                 = 0;* V* a) n8 x4 W
9 |3 N* M; a) X; T
        var.vt = VT_EMPTY;0 F* O. o" V7 l- O* p

4 `( b: K' h7 y( q$ n) e6 H//        Call IDispatch::Invoke(), @* p; p! j' q3 ^
) ?% ~/ I! I/ n& L7 h$ I+ t3 O
        hr = m_pDisp->Invoke(# ~% D% }2 x0 m9 m" ^1 A! H) c/ Q
                requestID,
# x8 k* T+ R* N3 x8 B2 f+ I                IID_NULL,' G9 c3 J0 M" r% o3 H. h; c5 H; q
                LOCALE_SYSTEM_DEFAULT,
# L; Z, s* i+ ]/ V4 g+ _! E4 P                DISPATCH_METHOD,
3 i4 U$ c( a0 S5 M( S                &dp2,
" t. N" n9 B2 Z, `. i! W                &var,
7 w. M# ?/ L3 ^# q: B* |                &ei,3 B: q- J+ H, I( V7 O( P. z4 t/ k
                &uiErr);* r6 X$ Y2 a9 C* l) S+ _
/ B3 b$ @2 z, E+ S  m
        SysFreeString(topicStr);& o4 R8 n' Z: W  d& Y4 B% D$ o1 b
        SysFreeString(itemStr);
. |3 \3 C$ _: D0 D1 V% _5 A请问该程序是获得extend里面的哪个值?
3 D- l) F" {0 e如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-8-13 07:54 , Processed in 0.022686 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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