1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir 29*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 30*cdf0e10cSrcweir #include "precompiled_sal.hxx" 31*cdf0e10cSrcweir // TestWin32.cpp : Definiert den Einsprungpunkt f�r die Anwendung. 32*cdf0e10cSrcweir // 33*cdf0e10cSrcweir 34*cdf0e10cSrcweir #define _WIN32_DCOM 35*cdf0e10cSrcweir #undef _UNICODE 36*cdf0e10cSrcweir 37*cdf0e10cSrcweir #include "stdafx.h" 38*cdf0e10cSrcweir 39*cdf0e10cSrcweir #include <windows.h> 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir #include <ole2.h> 42*cdf0e10cSrcweir #include <objidl.h> 43*cdf0e10cSrcweir #include <objbase.h> 44*cdf0e10cSrcweir #include <process.h> 45*cdf0e10cSrcweir #include <olectl.h> 46*cdf0e10cSrcweir #include <stdlib.h> 47*cdf0e10cSrcweir #include <malloc.h> 48*cdf0e10cSrcweir #include <..\..\inc\systools\win32\MtaOleClipb.h> 49*cdf0e10cSrcweir #include "XTDataObject.hxx" 50*cdf0e10cSrcweir 51*cdf0e10cSrcweir #include "resource.h" 52*cdf0e10cSrcweir 53*cdf0e10cSrcweir #define MAX_LOADSTRING 100 54*cdf0e10cSrcweir #undef USE_MTACB 55*cdf0e10cSrcweir 56*cdf0e10cSrcweir #define MSG_FLUSHCLIPBOARD WM_USER + 1 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir // Globale Variablen: 59*cdf0e10cSrcweir HINSTANCE hInst; // aktuelle Instanz 60*cdf0e10cSrcweir TCHAR szTitle[MAX_LOADSTRING]; // Text der Titelzeile 61*cdf0e10cSrcweir TCHAR szWindowClass[MAX_LOADSTRING]; // Text der Titelzeile 62*cdf0e10cSrcweir ATOM MyRegisterClass( HINSTANCE hInstance ); 63*cdf0e10cSrcweir BOOL InitInstance( HINSTANCE, int ); 64*cdf0e10cSrcweir LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ); 65*cdf0e10cSrcweir LRESULT CALLBACK About( HWND, UINT, WPARAM, LPARAM ); 66*cdf0e10cSrcweir void CopyClipboardData(HWND hwndParent); 67*cdf0e10cSrcweir void FlushClipboard( ); 68*cdf0e10cSrcweir void PasteData( HWND hWnd ); 69*cdf0e10cSrcweir void SetLocale(); 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir 72*cdf0e10cSrcweir LPSTREAM g_pStm = NULL; 73*cdf0e10cSrcweir char* pTextBuff = NULL; 74*cdf0e10cSrcweir DWORD lData = 0; 75*cdf0e10cSrcweir CXTDataObject* g_xtDo = NULL; 76*cdf0e10cSrcweir HWND g_hWnd; 77*cdf0e10cSrcweir HANDLE g_hEvent; 78*cdf0e10cSrcweir BOOL g_bEnd; 79*cdf0e10cSrcweir 80*cdf0e10cSrcweir //---------------------------------------------------- 81*cdf0e10cSrcweir // a thread function 82*cdf0e10cSrcweir //---------------------------------------------------- 83*cdf0e10cSrcweir 84*cdf0e10cSrcweir unsigned int _stdcall ThreadProc(LPVOID pParam) 85*cdf0e10cSrcweir { 86*cdf0e10cSrcweir while( !g_bEnd ) 87*cdf0e10cSrcweir { 88*cdf0e10cSrcweir WaitForSingleObject( g_hEvent, INFINITE ); 89*cdf0e10cSrcweir SendMessage( g_hWnd, MSG_FLUSHCLIPBOARD, WPARAM(0), LPARAM(0) ); 90*cdf0e10cSrcweir } 91*cdf0e10cSrcweir 92*cdf0e10cSrcweir return 0; 93*cdf0e10cSrcweir } 94*cdf0e10cSrcweir 95*cdf0e10cSrcweir //---------------------------------------------------- 96*cdf0e10cSrcweir // WinMain 97*cdf0e10cSrcweir //---------------------------------------------------- 98*cdf0e10cSrcweir 99*cdf0e10cSrcweir int APIENTRY WinMain(HINSTANCE hInstance, 100*cdf0e10cSrcweir HINSTANCE hPrevInstance, 101*cdf0e10cSrcweir LPSTR lpCmdLine, 102*cdf0e10cSrcweir int nCmdShow ) 103*cdf0e10cSrcweir { 104*cdf0e10cSrcweir // ZU ERLEDIGEN: F�gen Sie hier den Code ein. 105*cdf0e10cSrcweir MSG msg; 106*cdf0e10cSrcweir HACCEL hAccelTable; 107*cdf0e10cSrcweir HRESULT hr = E_FAIL; 108*cdf0e10cSrcweir 109*cdf0e10cSrcweir /* 110*cdf0e10cSrcweir g_hEvent = CreateEvent( 0, 111*cdf0e10cSrcweir FALSE, 112*cdf0e10cSrcweir FALSE, 113*cdf0e10cSrcweir NULL 114*cdf0e10cSrcweir ); 115*cdf0e10cSrcweir 116*cdf0e10cSrcweir g_bEnd = FALSE; 117*cdf0e10cSrcweir 118*cdf0e10cSrcweir _beginthreadex( ThreadProc, 119*cdf0e10cSrcweir 0, 120*cdf0e10cSrcweir NULL, 121*cdf0e10cSrcweir 0, 122*cdf0e10cSrcweir 0, 123*cdf0e10cSrcweir NULL ); 124*cdf0e10cSrcweir */ 125*cdf0e10cSrcweir 126*cdf0e10cSrcweir // it's important to initialize ole 127*cdf0e10cSrcweir // in order to use the clipboard 128*cdf0e10cSrcweir #ifdef USE_MTACB 129*cdf0e10cSrcweir hr = CoInitializeEx( NULL, COINIT_MULTITHREADED ); 130*cdf0e10cSrcweir #else 131*cdf0e10cSrcweir hr = OleInitialize( NULL ); 132*cdf0e10cSrcweir #endif 133*cdf0e10cSrcweir 134*cdf0e10cSrcweir 135*cdf0e10cSrcweir // Globale Zeichenfolgen initialisieren 136*cdf0e10cSrcweir LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); 137*cdf0e10cSrcweir LoadString(hInstance, IDC_TESTWIN32, szWindowClass, MAX_LOADSTRING); 138*cdf0e10cSrcweir MyRegisterClass(hInstance); 139*cdf0e10cSrcweir 140*cdf0e10cSrcweir // Initialisierung der Anwendung durchf�hren: 141*cdf0e10cSrcweir if( !InitInstance( hInstance, nCmdShow ) ) 142*cdf0e10cSrcweir { 143*cdf0e10cSrcweir return FALSE; 144*cdf0e10cSrcweir } 145*cdf0e10cSrcweir 146*cdf0e10cSrcweir hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_TESTWIN32); 147*cdf0e10cSrcweir 148*cdf0e10cSrcweir // Hauptnachrichtenschleife: 149*cdf0e10cSrcweir while( GetMessage(&msg, NULL, 0, 0) ) 150*cdf0e10cSrcweir { 151*cdf0e10cSrcweir if( !TranslateAccelerator (msg.hwnd, hAccelTable, &msg) ) 152*cdf0e10cSrcweir { 153*cdf0e10cSrcweir TranslateMessage( &msg ); 154*cdf0e10cSrcweir DispatchMessage( &msg ); 155*cdf0e10cSrcweir } 156*cdf0e10cSrcweir } 157*cdf0e10cSrcweir 158*cdf0e10cSrcweir // uninitializing the ole libraries 159*cdf0e10cSrcweir #ifdef USE_MTACB 160*cdf0e10cSrcweir CoUninitialize( ); 161*cdf0e10cSrcweir #else 162*cdf0e10cSrcweir OleUninitialize( ); 163*cdf0e10cSrcweir #endif 164*cdf0e10cSrcweir 165*cdf0e10cSrcweir CloseHandle( g_hEvent ); 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir return msg.wParam; 168*cdf0e10cSrcweir } 169*cdf0e10cSrcweir 170*cdf0e10cSrcweir 171*cdf0e10cSrcweir 172*cdf0e10cSrcweir //---------------------------------------------------------------- 173*cdf0e10cSrcweir // FUNKTION: MyRegisterClass() 174*cdf0e10cSrcweir // 175*cdf0e10cSrcweir // AUFGABE: Registriert die Fensterklasse. 176*cdf0e10cSrcweir // 177*cdf0e10cSrcweir // KOMMENTARE: 178*cdf0e10cSrcweir // 179*cdf0e10cSrcweir // Diese Funktion und ihre Verwendung sind nur notwendig, wenn dieser Code 180*cdf0e10cSrcweir // mit Win32-Systemen vor der 'RegisterClassEx'-Funktion kompatibel sein soll, 181*cdf0e10cSrcweir // die zu Windows 95 hinzugef�gt wurde. Es ist wichtig diese Funktion aufzurufen, 182*cdf0e10cSrcweir // damit der Anwendung kleine Symbole mit den richtigen Proportionen zugewiesen 183*cdf0e10cSrcweir // werden. 184*cdf0e10cSrcweir //---------------------------------------------------------------- 185*cdf0e10cSrcweir 186*cdf0e10cSrcweir ATOM MyRegisterClass( HINSTANCE hInstance ) 187*cdf0e10cSrcweir { 188*cdf0e10cSrcweir WNDCLASSEX wcex; 189*cdf0e10cSrcweir 190*cdf0e10cSrcweir wcex.cbSize = sizeof(WNDCLASSEX); 191*cdf0e10cSrcweir 192*cdf0e10cSrcweir wcex.style = CS_HREDRAW | CS_VREDRAW; 193*cdf0e10cSrcweir wcex.lpfnWndProc = (WNDPROC)WndProc; 194*cdf0e10cSrcweir wcex.cbClsExtra = 0; 195*cdf0e10cSrcweir wcex.cbWndExtra = 0; 196*cdf0e10cSrcweir wcex.hInstance = hInstance; 197*cdf0e10cSrcweir wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_TESTWIN32); 198*cdf0e10cSrcweir wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 199*cdf0e10cSrcweir wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 200*cdf0e10cSrcweir wcex.lpszMenuName = (LPCTSTR)IDC_TESTWIN32; 201*cdf0e10cSrcweir wcex.lpszClassName = _T(szWindowClass); 202*cdf0e10cSrcweir wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); 203*cdf0e10cSrcweir 204*cdf0e10cSrcweir return RegisterClassEx(&wcex); 205*cdf0e10cSrcweir } 206*cdf0e10cSrcweir 207*cdf0e10cSrcweir //---------------------------------------------------------------- 208*cdf0e10cSrcweir // FUNKTION: InitInstance(HANDLE, int) 209*cdf0e10cSrcweir // 210*cdf0e10cSrcweir // AUFGABE: Speichert die Instanzzugriffsnummer und erstellt das Hauptfenster 211*cdf0e10cSrcweir // 212*cdf0e10cSrcweir // KOMMENTARE: 213*cdf0e10cSrcweir // 214*cdf0e10cSrcweir // In dieser Funktion wird die Instanzzugriffsnummer in einer globalen Variable 215*cdf0e10cSrcweir // gespeichert und das Hauptprogrammfenster erstellt und angezeigt. 216*cdf0e10cSrcweir //---------------------------------------------------------------- 217*cdf0e10cSrcweir 218*cdf0e10cSrcweir BOOL InitInstance( HINSTANCE hInstance, int nCmdShow ) 219*cdf0e10cSrcweir { 220*cdf0e10cSrcweir hInst = hInstance; // Instanzzugriffsnummer in unserer globalen Variable speichern 221*cdf0e10cSrcweir 222*cdf0e10cSrcweir g_hWnd = CreateWindowEx(0, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 223*cdf0e10cSrcweir CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 224*cdf0e10cSrcweir 225*cdf0e10cSrcweir if( !g_hWnd ) 226*cdf0e10cSrcweir { 227*cdf0e10cSrcweir return FALSE; 228*cdf0e10cSrcweir } 229*cdf0e10cSrcweir 230*cdf0e10cSrcweir ShowWindow( g_hWnd, nCmdShow ); 231*cdf0e10cSrcweir UpdateWindow( g_hWnd ); 232*cdf0e10cSrcweir 233*cdf0e10cSrcweir return TRUE; 234*cdf0e10cSrcweir } 235*cdf0e10cSrcweir 236*cdf0e10cSrcweir //---------------------------------------------------------------- 237*cdf0e10cSrcweir // FUNKTION: WndProc(HWND, unsigned, WORD, LONG) 238*cdf0e10cSrcweir // 239*cdf0e10cSrcweir // AUFGABE: Verarbeitet Nachrichten f�r das Hauptfenster. 240*cdf0e10cSrcweir // 241*cdf0e10cSrcweir // WM_COMMAND - Anwendungsmen� verarbeiten 242*cdf0e10cSrcweir // WM_PAINT - Hauptfenster darstellen 243*cdf0e10cSrcweir // WM_DESTROY - Beendigungsnachricht ausgeben und zur�ckkehren 244*cdf0e10cSrcweir //---------------------------------------------------------------- 245*cdf0e10cSrcweir 246*cdf0e10cSrcweir LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 247*cdf0e10cSrcweir { 248*cdf0e10cSrcweir int wmId; 249*cdf0e10cSrcweir int wmEvent; 250*cdf0e10cSrcweir PAINTSTRUCT ps; 251*cdf0e10cSrcweir HDC hdc; 252*cdf0e10cSrcweir TCHAR szHello[MAX_LOADSTRING]; 253*cdf0e10cSrcweir 254*cdf0e10cSrcweir 255*cdf0e10cSrcweir LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); 256*cdf0e10cSrcweir 257*cdf0e10cSrcweir switch( message ) 258*cdf0e10cSrcweir { 259*cdf0e10cSrcweir case WM_COMMAND: 260*cdf0e10cSrcweir wmId = LOWORD(wParam); 261*cdf0e10cSrcweir wmEvent = HIWORD(wParam); 262*cdf0e10cSrcweir // Men�auswahlen analysieren: 263*cdf0e10cSrcweir switch( wmId ) 264*cdf0e10cSrcweir { 265*cdf0e10cSrcweir case IDD_COPY: 266*cdf0e10cSrcweir CopyClipboardData(hWnd); 267*cdf0e10cSrcweir break; 268*cdf0e10cSrcweir case IDD_PASTE2: 269*cdf0e10cSrcweir PasteData(hWnd); 270*cdf0e10cSrcweir break; 271*cdf0e10cSrcweir case IDD_LOCALE: 272*cdf0e10cSrcweir SetLocale(); 273*cdf0e10cSrcweir break; 274*cdf0e10cSrcweir case IDM_EXIT: 275*cdf0e10cSrcweir DestroyWindow( hWnd ); 276*cdf0e10cSrcweir break; 277*cdf0e10cSrcweir 278*cdf0e10cSrcweir default: 279*cdf0e10cSrcweir return DefWindowProc( hWnd, message, wParam, lParam ); 280*cdf0e10cSrcweir } 281*cdf0e10cSrcweir break; 282*cdf0e10cSrcweir 283*cdf0e10cSrcweir case WM_PAINT: 284*cdf0e10cSrcweir hdc = BeginPaint (hWnd, &ps); 285*cdf0e10cSrcweir // ZU ERLEDIGEN: Hier beliebigen Code zum Zeichnen hinzuf�gen... 286*cdf0e10cSrcweir RECT rt; 287*cdf0e10cSrcweir GetClientRect( hWnd, &rt ); 288*cdf0e10cSrcweir 289*cdf0e10cSrcweir if ( NULL != pTextBuff ) 290*cdf0e10cSrcweir { 291*cdf0e10cSrcweir DrawText( hdc, pTextBuff, lData, &rt, DT_CENTER ); 292*cdf0e10cSrcweir } 293*cdf0e10cSrcweir else 294*cdf0e10cSrcweir { 295*cdf0e10cSrcweir DrawText( hdc, szHello, strlen(szHello), &rt, DT_CENTER ); 296*cdf0e10cSrcweir } 297*cdf0e10cSrcweir 298*cdf0e10cSrcweir EndPaint( hWnd, &ps ); 299*cdf0e10cSrcweir break; 300*cdf0e10cSrcweir 301*cdf0e10cSrcweir case WM_DESTROY: 302*cdf0e10cSrcweir g_bEnd = TRUE; 303*cdf0e10cSrcweir SetEvent( g_hEvent ); 304*cdf0e10cSrcweir FlushClipboard( ); 305*cdf0e10cSrcweir PostQuitMessage( 0 ); 306*cdf0e10cSrcweir break; 307*cdf0e10cSrcweir 308*cdf0e10cSrcweir default: 309*cdf0e10cSrcweir return DefWindowProc( hWnd, message, wParam, lParam ); 310*cdf0e10cSrcweir } 311*cdf0e10cSrcweir return 0; 312*cdf0e10cSrcweir } 313*cdf0e10cSrcweir 314*cdf0e10cSrcweir //---------------------------------------------- 315*cdf0e10cSrcweir // copy data into the clipboard 316*cdf0e10cSrcweir //---------------------------------------------- 317*cdf0e10cSrcweir 318*cdf0e10cSrcweir void CopyClipboardData( HWND hWnd ) 319*cdf0e10cSrcweir { 320*cdf0e10cSrcweir g_xtDo = new CXTDataObject( 1 ); 321*cdf0e10cSrcweir #ifdef USE_MTACB 322*cdf0e10cSrcweir MTASetClipboard( static_cast< IDataObject* >( g_xtDo ) ); 323*cdf0e10cSrcweir #else 324*cdf0e10cSrcweir OleSetClipboard( static_cast< IDataObject* >( g_xtDo ) ); 325*cdf0e10cSrcweir #endif 326*cdf0e10cSrcweir } 327*cdf0e10cSrcweir 328*cdf0e10cSrcweir //---------------------------------------------- 329*cdf0e10cSrcweir // flush the content into the clipboard 330*cdf0e10cSrcweir //---------------------------------------------- 331*cdf0e10cSrcweir 332*cdf0e10cSrcweir void FlushClipboard( ) 333*cdf0e10cSrcweir { 334*cdf0e10cSrcweir if ( NULL != g_xtDo ) 335*cdf0e10cSrcweir { 336*cdf0e10cSrcweir #ifdef USE_MTACB 337*cdf0e10cSrcweir HRESULT hr = MTAIsCurrentClipboard( static_cast< IDataObject* >( g_xtDo ) ); 338*cdf0e10cSrcweir if ( S_OK == hr ) 339*cdf0e10cSrcweir MTAFlushClipboard( ); 340*cdf0e10cSrcweir #else 341*cdf0e10cSrcweir HRESULT hr = OleIsCurrentClipboard( static_cast< IDataObject* >( g_xtDo ) ); 342*cdf0e10cSrcweir if ( S_OK == hr ) 343*cdf0e10cSrcweir OleFlushClipboard( ); 344*cdf0e10cSrcweir #endif 345*cdf0e10cSrcweir 346*cdf0e10cSrcweir static_cast< IDataObject* >( g_xtDo )->Release( ); 347*cdf0e10cSrcweir } 348*cdf0e10cSrcweir } 349*cdf0e10cSrcweir 350*cdf0e10cSrcweir 351*cdf0e10cSrcweir void PasteData(HWND hWnd) 352*cdf0e10cSrcweir { 353*cdf0e10cSrcweir IDataObject* pDataObj; 354*cdf0e10cSrcweir 355*cdf0e10cSrcweir //FlushClipboard( ); 356*cdf0e10cSrcweir 357*cdf0e10cSrcweir HRESULT hr = OleGetClipboard( &pDataObj ); 358*cdf0e10cSrcweir if ( SUCCEEDED( hr ) ) 359*cdf0e10cSrcweir { 360*cdf0e10cSrcweir FORMATETC fetc; 361*cdf0e10cSrcweir STGMEDIUM stgmedium; 362*cdf0e10cSrcweir 363*cdf0e10cSrcweir fetc.cfFormat = CF_LOCALE; 364*cdf0e10cSrcweir fetc.ptd = NULL; 365*cdf0e10cSrcweir fetc.dwAspect = DVASPECT_CONTENT; 366*cdf0e10cSrcweir fetc.lindex = -1; 367*cdf0e10cSrcweir fetc.tymed = TYMED_HGLOBAL; 368*cdf0e10cSrcweir 369*cdf0e10cSrcweir hr = pDataObj->GetData( &fetc, &stgmedium ); 370*cdf0e10cSrcweir if ( SUCCEEDED( hr ) ) 371*cdf0e10cSrcweir { 372*cdf0e10cSrcweir LPVOID lpData = GlobalLock( stgmedium.hGlobal ); 373*cdf0e10cSrcweir 374*cdf0e10cSrcweir if ( NULL != lpData ) 375*cdf0e10cSrcweir { 376*cdf0e10cSrcweir LCID lcid = *( (WORD*)lpData ); 377*cdf0e10cSrcweir 378*cdf0e10cSrcweir WORD langID = LANGIDFROMLCID( lcid ); 379*cdf0e10cSrcweir WORD sublangID = SUBLANGID( langID ); 380*cdf0e10cSrcweir 381*cdf0e10cSrcweir TCHAR buff[6]; 382*cdf0e10cSrcweir int cbWritten = GetLocaleInfo( lcid, LOCALE_IDEFAULTANSICODEPAGE, buff, sizeof( buff ) ); 383*cdf0e10cSrcweir cbWritten = GetLocaleInfo( lcid, LOCALE_IDEFAULTCODEPAGE, buff, sizeof( buff ) ); 384*cdf0e10cSrcweir 385*cdf0e10cSrcweir GlobalUnlock( stgmedium.hGlobal ); 386*cdf0e10cSrcweir } 387*cdf0e10cSrcweir else 388*cdf0e10cSrcweir { 389*cdf0e10cSrcweir DWORD dwLastError = GetLastError( ); 390*cdf0e10cSrcweir } 391*cdf0e10cSrcweir 392*cdf0e10cSrcweir ReleaseStgMedium( &stgmedium ); 393*cdf0e10cSrcweir } 394*cdf0e10cSrcweir } 395*cdf0e10cSrcweir } 396*cdf0e10cSrcweir 397*cdf0e10cSrcweir 398*cdf0e10cSrcweir void SetLocale() 399*cdf0e10cSrcweir { 400*cdf0e10cSrcweir LCID threadLcid = GetThreadLocale(); 401*cdf0e10cSrcweir } 402*cdf0e10cSrcweir 403