xref: /AOO41X/main/dtrans/source/win32/workbench/testmarshal.cxx (revision 48123e16153c92857455f9e7a0d17cc19307983f)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_dtrans.hxx"
26 
27 
28 //_________________________________________________________________________________________________________________________
29 //  interface includes
30 //_________________________________________________________________________________________________________________________
31 
32 //_________________________________________________________________________________________________________________________
33 //  other includes
34 //_________________________________________________________________________________________________________________________
35 #include <rtl/ustring.hxx>
36 #include <sal/types.h>
37 #include <osl/diagnose.h>
38 
39 #include <stdio.h>
40 #if defined _MSC_VER
41 #pragma warning(push,1)
42 #endif
43 #include <windows.h>
44 #include <objbase.h>
45 #if defined _MSC_VER
46 #pragma warning(pop)
47 #endif
48 
49 #include <memory>
50 
51 #include <process.h>
52 #include "XTDo.hxx"
53 
54 //-------------------------------------------------------------
55 // my defines
56 //-------------------------------------------------------------
57 
58 #define WRITE_CB
59 #define EVT_MANUAL_RESET     TRUE
60 #define EVT_INIT_NONSIGNALED FALSE
61 #define EVT_NONAME           ""
62 #define WAIT_MSGLOOP
63 #define RAW_MARSHALING
64 
65 //------------------------------------------------------------
66 //  namesapces
67 //------------------------------------------------------------
68 
69 using namespace ::rtl;
70 using namespace ::std;
71 
72 //------------------------------------------------------------
73 //  globales
74 //------------------------------------------------------------
75 
76 HANDLE  g_hEvtThreadWakeup;
77 
78 #ifdef RAW_MARSHALING
79     HGLOBAL g_hGlob;
80 #else
81     IStream* g_pStm;
82 #endif
83 
84 //################################################################
85 // a thread in another apartment to test apartment transparency
86 
ThreadProc(LPVOID pParam)87 unsigned int _stdcall ThreadProc(LPVOID pParam)
88 {
89     // setup another apartment
90     HRESULT hr = OleInitialize( NULL );
91 
92     WaitForSingleObject( g_hEvtThreadWakeup, INFINITE );
93 
94     IDataObject* pIDo;
95 
96 #ifdef RAW_MARSHALING
97 
98     IStream* pStm = NULL;
99     hr = CreateStreamOnHGlobal( g_hGlob, FALSE, &pStm );
100     if ( SUCCEEDED( hr ) )
101     {
102         hr = CoUnmarshalInterface(
103                 pStm,
104                 __uuidof( IDataObject ),
105                 (void**)&pIDo );
106 
107         hr = pStm->Release( );
108     }
109 
110 #else
111 
112     hr = CoGetInterfaceAndReleaseStream(
113         g_pStm,
114         __uuidof( IDataObject ),
115         (void**)&pIDo
116         );
117 
118 #endif
119 
120     IEnumFORMATETC* pIEEtc;
121     hr = pIDo->EnumFormatEtc( DATADIR_GET, &pIEEtc );
122 
123     hr = OleIsCurrentClipboard( pIDo );
124 
125     hr = OleFlushClipboard( );
126 
127     OleUninitialize( );
128 
129     return 0;
130 }
131 
132 //################################################################
133 
134 //----------------------------------------------------------------
135 //  main
136 //----------------------------------------------------------------
137 
main(int nArgc,char * Argv[])138 int SAL_CALL main( int nArgc, char* Argv[] )
139 {
140     HRESULT hr = OleInitialize( NULL );
141 
142     g_hEvtThreadWakeup = CreateEvent( 0,
143                                       EVT_MANUAL_RESET,
144                                       EVT_INIT_NONSIGNALED,
145                                       EVT_NONAME );
146 
147     unsigned uThreadId;
148     HANDLE   hThread;
149 
150     // create a thread in another apartment
151     hThread = (void*)_beginthreadex( NULL, 0, ThreadProc, NULL, 0, &uThreadId );
152 
153     IDataObject* pIDo = new CXTDataObject( );
154 
155     hr = OleSetClipboard( pIDo );
156     hr = E_FAIL;
157 
158     hr = OleIsCurrentClipboard( pIDo );
159 
160     //hr = OleGetClipboard( &pIDo );
161     if ( SUCCEEDED( hr ) )
162     {
163 #ifdef RAW_MARSHALING
164 
165         IStream* pStm = NULL;
166 
167         hr = CreateStreamOnHGlobal( 0, FALSE, &pStm );
168         if ( SUCCEEDED( hr ) )
169         {
170             hr = CoMarshalInterface(
171                 pStm,
172                 __uuidof( IDataObject ),
173                 pIDo,
174                 MSHCTX_INPROC,
175                 0,
176                 MSHLFLAGS_NORMAL );
177             if ( SUCCEEDED( hr ) )
178                 hr = GetHGlobalFromStream( pStm, &g_hGlob );
179 
180             hr = pStm->Release( );
181         }
182 
183 #else
184 
185         hr = CoMarshalInterThreadInterfaceInStream(
186                 __uuidof( IDataObject ),
187                 pIDo,
188                 &g_pStm );
189 
190 #endif
191 
192         if ( SUCCEEDED( hr ) )
193         {
194             // wakeup the thread and waiting util it ends
195             SetEvent( g_hEvtThreadWakeup );
196 
197 #ifdef WAIT_MSGLOOP
198 
199             BOOL bContinue = TRUE;
200 
201             while( bContinue )
202             {
203                 DWORD dwResult = WaitForMultipleObjects(
204                     1,
205                     &hThread,
206                     TRUE,
207                     0 );
208 
209                 if ( WAIT_OBJECT_0 == dwResult )
210                 {
211                     bContinue = FALSE;
212                 }
213                 else
214                 {
215                     MSG msg;
216                     while( PeekMessage(
217                             &msg,
218                             NULL,
219                             0,
220                             0,
221                             PM_REMOVE ) )
222                     {
223                         TranslateMessage(&msg);
224                         DispatchMessage(&msg);
225                     }
226                 }
227             } // while
228 
229 #endif
230 
231         } // if
232     } // if
233 
234     OleFlushClipboard( );
235 
236     OleUninitialize( );
237 
238     return 0;
239 }
240