设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11883|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:; v' l- |' d: @+ I, _) c" }# R0 a
Name = (WCHAR *) L"Poke";5 ?1 e6 K) @, P1 K0 e
                
! a! H& O! F: O3 \2 k        hr = m_pDisp->GetIDsOfNames (
! N/ ~" [1 u! W5 c% |) b                IID_NULL,                                // reserved( C' _* w" P; E( X( O) @
                &Name,                                        // Array of names to get IDs for( r# l6 A2 b' j8 k) |
                1,                                        // # of names in the array
- o1 v7 b& ]4 m8 ?7 n                LOCALE_SYSTEM_DEFAULT,        // System locale
0 w! S* {) O* |                &pokeID);                                // Array of IDs to fill on output
" B# P' A- h9 z+ U+ D  ^8 q; r                        & Q+ O5 i+ \, i: ~
        if (hr)* R7 N5 ^$ o9 i
                {
1 F* ?$ S, ]) e! {( o7 D: ?                MessageBox ("Get Poke Unsuccessful");
% v" d1 x$ u) ?  f( H                return;% x! @$ F$ [; J
                }
4 J& l) ^/ P. o4 V0 j- @
0 M/ h* i$ V! n: b; s6 F/**************************传递数据给extend**************************************/* u% a2 y; z/ ?
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
0 O7 L  b* x2 c5 q! J+ H% X: ?. d        ! q% s! n6 T8 p- i  X, P* g
        valueStr                                 = SysAllocString((WCHAR *) L"1232");
" D* x) h! s3 Z6 j        VariantInit(&pokeVariant[0]);
4 [/ S% e! ~" z  X        pokeVariant[0].vt                 = VT_BSTR;, ~% n8 U9 g7 K9 f" I8 ?% [6 f, `* i5 C
        pokeVariant[0].bstrVal         = valueStr;2 R0 x8 }7 r( U, O' i% _
: [" ]1 F2 C6 S$ e: Q1 F# d
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
4 f* V* |6 ~3 T$ D        VariantInit(&pokeVariant[1]);
! b4 F% t% Y* y6 u5 a4 g# F        pokeVariant[1].vt                 = VT_BSTR;5 H* L; I5 D# q+ U& N  w& `
        pokeVariant[1].bstrVal         = itemStr;
2 k, v0 _1 p& ?8 U4 f$ {/ ?5 f" p7 r" ]9 L- i( A3 e8 h' [
          topicStr                                 = SysAllocString((WCHAR *) L"system");. P3 u5 T0 x) f. k: ^6 r5 [
        VariantInit(&pokeVariant[2]);
$ C9 W" [+ S% G5 G1 w        pokeVariant[2].vt                 = VT_BSTR;
& d! X( t$ z  g$ s5 I        pokeVariant[2].bstrVal         = topicStr;' X  Z, s9 Y, r! P7 L+ S4 F2 _2 k

0 @* U* x. g6 w//        Set the DISPPARAMS structure that holds the variant.! s3 E1 K3 Z) U5 ?7 O2 R

% `/ r$ m. F9 W3 h; c% K        dp.rgvarg                                         = pokeVariant;
$ S6 G. S1 O0 V/ e! C$ h        dp.cArgs                                         = 3;
- Q; M: x& I! @. l+ x8 o2 L  W        dp.rgdispidNamedArgs                 = NULL;
) C& H7 I- K' l7 p( ^% }- ~8 R        dp.cNamedArgs                                 = 0;
* Y/ F! g9 l2 D. ?# ]: F0 v' h: L1 \1 X9 t
//        Call IDispatch::Invoke()
# f* _4 u$ [9 ]0 n) O" v+ [
; P  a) c2 a3 [- w        hr = m_pDisp->Invoke($ F8 m& l% ^$ x0 t+ l9 {" m$ V4 j) Z
                pokeID,
; c3 P+ W+ Z: Y' ~8 p                IID_NULL,* J# B2 O* u/ a, g1 `9 T
                LOCALE_SYSTEM_DEFAULT,  `+ i4 T  t. i3 o
                DISPATCH_METHOD,3 [- _- Z  d) q, Z+ \
                &dp,
1 N7 |1 ^& E; C7 ^1 b1 \                NULL,
' h; s5 V; N: N- c6 T                &ei,- [' P7 `  o; c$ S
                &uiErr);0 T# g: ]0 e5 b- Z9 P$ \) A- z$ _) p: e  y
8 O9 X- O% a; k
        SysFreeString(topicStr);$ c; f) }9 L+ }5 e1 }1 b
        SysFreeString(itemStr);
$ O  E) m, G0 _        SysFreeString(valueStr);8 D1 z5 {8 V7 `. ]
( _' w$ s/ ~  ?! G$ F( C
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???+ }4 w6 B, e: Q" ?4 B
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????1 m  k' n$ H# w! B: A! H

) @( M3 c  z! U/ h% S0 F! k
: r( {3 E9 Y" _2.这是request的程序
" J+ n6 `4 ^- Z. A//  Request a value from Extend
: V3 G- ?1 _# A7 y1 B2 D8 `* L//
& D9 B, |$ s  n0 s5 _) Z//        Initialize the variant that will hold the BSTR.  Set the variant's
. L; f$ M! d6 P- d//        type flag to indicate the fact that this variant holds a BSTR. Place the' P0 l5 ]1 O0 i* `
//        BSTR into the variant structure.7 c: @! G8 F& G' R" R

( f5 C$ G( N' K        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);3 k/ t) D9 c* ]- R/ W8 H/ ^' L
       
* D4 Y4 I4 ]$ f4 Q, k         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
3 n3 |# t. v6 s  l* j, X" v; N- {        VariantInit(&requestVariant[0]); 7 ^* X! d+ Q( _6 w
        requestVariant[0].vt                 = VT_BSTR;& S* J# z. _5 ~) `8 C
        requestVariant[0].bstrVal         = itemStr;
" y8 W9 U, Q6 X1 a0 e/ z& z
4 ~/ s. K7 ?( l+ q3 v0 c          topicStr                                         = SysAllocString((WCHAR *) L"system");  v/ u4 y( s; U. Q0 L* i
        VariantInit(&requestVariant[1]); ) V0 t2 ~% q5 ~. {
        requestVariant[1].vt                 = VT_BSTR;
2 X! j7 g" }" `: M        requestVariant[1].bstrVal         = topicStr;
% F' D) @$ f6 I
: q" U% b" q: ?, V( ~9 o3 q//        Set the DISPPARAMS structure that holds the variant.% Q8 N; q$ ]4 Q1 q
% B& ]1 o' G( V3 t- P/ H
        dp2.rgvarg                                         = requestVariant;
& D3 _: g; E- _/ b# o% F8 V        dp2.cArgs                                         = 2;
, Q! N: B' s- g- ~! W# n* [: U5 v        dp2.rgdispidNamedArgs                 = NULL;' L6 d5 W0 q7 M
        dp2.cNamedArgs                                 = 0;+ z& D$ P: D, l* B, k1 Y9 A+ ^

; }- z) G8 m. v! e/ R/ a         var.vt = VT_EMPTY;7 `0 T2 f+ h3 V; {; w. Q/ q' H

; V) s$ v& o* m) p% j# w5 F//        Call IDispatch::Invoke()
! e! w4 X1 E9 `2 x
9 Z. g# V" r8 @$ }        hr = m_pDisp->Invoke(' w' V% W4 O5 p! L
                requestID,- _0 M2 f- O$ ?: x! u7 ?
                IID_NULL,$ @3 x, N( j; m9 l! i6 I
                LOCALE_SYSTEM_DEFAULT,. U6 e& S8 v/ g! `5 K
                DISPATCH_METHOD,7 p* T) U7 \7 W) S! M
                &dp2,
* G, b0 V, X' _/ T! o                &var,
1 h0 W) ?( B& s3 b4 Q* o7 j                &ei,. E/ d& g! D+ i( u- l/ |1 `
                &uiErr);
; e8 r$ H0 k. m& j$ |8 W
( q4 Z- `5 m3 W$ X7 J' ^3 D6 Q: X        SysFreeString(topicStr);  s! E' [, {( J, n0 V! Z
        SysFreeString(itemStr);9 g$ o( v2 c3 ~# G' w& O
请问该程序是获得extend里面的哪个值?
( k0 _8 F* Q, ^# T如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-7-23 11:25 , Processed in 0.013518 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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