bfe11b34be730455dda0453c9d246cdf45700ffc
[reactos.git] / reactos / tools / rbuild / backend / msvc / genguid.cpp
1 /*
2 * Based on the genguid utility for WINE and ReactOS
3 *
4 * Copyright 2003 Jonathan Wilson
5 * Copyright 2005 Steven Edwards
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 *
21 */
22
23 #ifdef _WIN32
24 #include <objbase.h>
25 #include <stdio.h>
26
27 typedef HRESULT _stdcall CoInitializeFunc ( PVOID );
28 typedef void _stdcall CoUninitializeFunc ( void );
29 typedef HRESULT _stdcall CoCreateGuidFunc ( GUID* );
30
31 static CoInitializeFunc *pCoInitialize = NULL;
32 static CoUninitializeFunc *pCoUninitialize = NULL;
33 static CoCreateGuidFunc *pCoCreateGuid = NULL;
34
35 void gen_guid()
36 {
37 GUID m_guid;
38 HRESULT result;
39 bool good_guid = false;
40
41 // Load ole32. We will need it later on
42 HMODULE olelib = LoadLibrary ( "ole32.dll" );
43 if ( olelib != NULL )
44 {
45 pCoInitialize = (CoInitializeFunc *)GetProcAddress( olelib, "CoInitialize" );
46 pCoUninitialize = (CoUninitializeFunc *)GetProcAddress( olelib, "CoUninitialize" );
47 pCoCreateGuid = (CoCreateGuidFunc *)GetProcAddress( olelib, "CoCreateGuid" );
48 if ( !pCoInitialize || !pCoUninitialize || !pCoCreateGuid )
49 printf ( "Missing exports from ole32.dll\n" );
50 else
51 {
52 if (pCoInitialize(NULL) != S_OK)
53 printf("Unable to initalize OLE libraries\n");
54 else
55 {
56 result = pCoCreateGuid(&m_guid);
57 if (result != S_OK)
58 printf("Unable to create GUID\n");
59 else
60 good_guid = true;
61 pCoUninitialize();
62 }
63 }
64 FreeLibrary ( olelib );
65 }
66 if ( !good_guid )
67 {
68 // TODO FIXME - fall-back to random #'s
69 }
70 const char* strfmt = "%08lX-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X\r\n";
71 printf(strfmt,m_guid.Data1,m_guid.Data2,m_guid.Data3,m_guid.Data4[0],
72 m_guid.Data4[1],m_guid.Data4[2],m_guid.Data4[3],m_guid.Data4[4],m_guid.Data4[5],
73 m_guid.Data4[6],m_guid.Data4[7],m_guid.Data1,m_guid.Data2,m_guid.Data3,m_guid.Data4[0],
74 m_guid.Data4[1],m_guid.Data4[2],m_guid.Data4[3],m_guid.Data4[4],m_guid.Data4[5],
75 m_guid.Data4[6],m_guid.Data4[7]);
76 }
77
78 #else /* Linux, etc */
79 void gen_guid()
80 {
81 }
82 #endif /* WIN32/Linux */