R
Hallo,
ich habe ein Visual C++ Projekt, in dem ich einen COM server implementiere. Dies klappt einwandfrei, solange ich die GUIDs für die Objekte direkt mit einem Generator erstellen lasse und fest in die Quelldatei eintrage. Nun will ich dies allerdings während des Compile automatisch generieren lassen und den Objekten zuordnen. Dies ist irgendwie etwas schwierig, da die GUIDs im .idl file eingetragen sind und dieses keine globalen Variablen aus den c-Dateien nimmt...
Hier mein .idl file:
import "oaidl.idl";
import "ocidl.idl";
import "guid.h";
// define the ICommunication interface
[object, uuid(guid),
oleautomation, helpstring("Handles the communication")]
interface ICommunication : IUnknown
{
HRESULT GetDataInBSTR([out, retval] BSTR* pBstr);
};
// library statement
[uuid(guid), version(1.0),
helpstring("Local server with typeLib")]
library LocalServerTypeInfo
{
importlib(stdole32.tlb);
[uuid(guid)]
coclass LocalServer
{
[default] interface ICommunication;
};
};
Hier mein C file zur Generierung der GUIDs:
#include <Rpcdce.h> // für GUID-Funktionen
#include <string.h> // für String-Funktionen
#include <guid.h>
#pragma comment(lib, "Rpcrt4.lib") // Rpcrt4.lib einbinden (GUID-Funktionen)
void fguid()
{
unsigned char *StringUuid ; // Zeiger für die Umwandlung
HKEY hKeyReg ; // Registrykey
TCHAR szKey[MAX_PATH] = "SOFTWARE\\Euklid\\Services\\"; // Schluessel-Path
// guid auf 0 setzen
memset (&guid, '\0', sizeof (guid)) ;
// neuen class GUID erstellen
if (CoCreateGuid (&guid) == S_OK){
if (UuidToString (&guid, &StringUuid) == RPC_S_OK)
{ // GUID in "unsigned char" formatieren
strcpy (szGuid_class, "{") ;
strcat (szGuid_class, (char*) StringUuid) ;
strcat (szGuid_class, "}") ;
RpcStringFree (&StringUuid) ;
}
else
{
MessageBox (NULL, "Fehler in GUID-Erstellung.", ":(", MB_ICONERROR) ;
return 0 ;
}
}
else
{
MessageBox (NULL, "Fehler in GUID-Erstellung", ":(", MB_ICONERROR) ;
return 0 ;
}
// Registrykey mit dem neuen GUID erstellen
strcpy (szKey, "SOFTWARE\\Euklid\\Services\\") ; //
strcat (szKey, szGuid_class) ;
// neuen Schluessel erstellen
if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, szKey, 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKeyReg, 0) == ERROR_SUCCESS)
{
RegCloseKey (hKeyReg) ;
MessageBox (NULL, szGuid, "Schlüssel registriert.", NULL) ;
}
else
MessageBox (NULL, "Fehler bei Schlüssel-Erstellung", ":(", MB_ICONERROR) ;
Kann mir jemand helfen?