home *** CD-ROM | disk | FTP | other *** search
-
- #include "lstr.h"
-
- long g_cLock = -1;
- long g_ObjectCount = 0;
-
-
- long g_fClassRegistered = FALSE;
- DWORD g_dwRegister = 0;
-
-
- HRESULT RegisterClassFactory()
- {
- HRESULT hr;
- CLowerStrClassFactory *pClassFactory;
-
- pClassFactory = new CLowerStrClassFactory;
-
- if (pClassFactory != 0)
- {
- hr = CoRegisterClassObject(CLSID_CLowerStr,
- (IUnknown *) pClassFactory,
- CLSCTX_LOCAL_SERVER,
- REGCLS_SINGLEUSE,
- &g_dwRegister);
- pClassFactory->Release();
- hr = S_OK;
- }
- else
- {
- hr = E_OUTOFMEMORY;
- }
-
- return hr;
- }
-
-
- HRESULT RevokeClassFactory()
- {
- HRESULT hr;
-
- hr = CoRevokeClassObject(g_dwRegister);
-
- return hr;
- }
-
- void main(int argc, char *argv[])
- {
- HRESULT hr = S_OK;
- int i;
- BOOL bRegisterServer = FALSE;
- BOOL bUnregisterServer = FALSE;
- MSG msg;
-
-
- for (i = 1; i < argc; i++)
- {
- if (_stricmp( argv[i], "/REGSERVER" ) == 0) {
- bRegisterServer = TRUE;
- }
- else if (_stricmp( argv[i], "/UNREGSERVER" ) == 0) {
- bUnregisterServer = TRUE;
- }
- }
-
- if(bRegisterServer)
- {
- RegisterLocalServer(CLSID_CLowerStr);
- return;
- }
-
- if(bUnregisterServer)
- {
- UnregisterLocalServer(CLSID_CLowerStr);
- return;
- }
-
- hr = CoInitialize(NULL);
-
- if (FAILED(hr)) {
- printf("CoInitialize failed [0x%x].\n", hr);
- return;
- }
-
- hr = RegisterClassFactory();
- if (SUCCEEDED(hr))
- {
- printf("Waiting for client to connect...\n");
-
- while (GetMessage(&msg, NULL, 0, 0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
-
- RevokeClassFactory();
- }
- else
- {
- printf("Failed to register class factory [0x%x].\n", hr);
- }
-
- CoUninitialize();
-
- return;
- }
-
-
- HRESULT RegisterLocalServer(REFCLSID rclsid)
- {
- HRESULT hr;
- LONG lError;
- HKEY hKeyCLSID;
- HKEY hKeyClassID;
- HKEY hKey; // current key
- DWORD dwDisposition;
- char szServer[MAX_PATH];
- char szClassID[39];
- ULONG ulLength;
-
- ulLength = GetModuleFileNameA(0, szServer, sizeof(szServer));
-
- if (ulLength == 0)
- {
- hr = HRESULT_FROM_WIN32(GetLastError());
- return hr;
- }
-
- //create the CLSID key
- lError = RegCreateKeyExA(
- HKEY_CLASSES_ROOT,
- "CLSID",
- 0,
- "REG_SZ",
- REG_OPTION_NON_VOLATILE,
- KEY_ALL_ACCESS,
- 0,
- &hKeyCLSID,
- &dwDisposition);
-
- if (!lError) {
- //convert the class ID to a registry key name.
- sprintf(szClassID,
- "{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
- rclsid.Data1, rclsid.Data2, rclsid.Data3,
- rclsid.Data4[0], rclsid.Data4[1],
- rclsid.Data4[2], rclsid.Data4[3],
- rclsid.Data4[4], rclsid.Data4[5],
- rclsid.Data4[6], rclsid.Data4[7]);
-
- //create key for the server class
- lError = RegCreateKeyExA(hKeyCLSID,
- szClassID,
- 0,
- "REG_SZ",
- REG_OPTION_NON_VOLATILE,
- KEY_ALL_ACCESS,
- 0,
- &hKeyClassID,
- &dwDisposition);
-
- if (!lError) {
- //create LocalServer32 key.
- lError = RegCreateKeyExA(hKeyClassID,
- "LocalServer32",
- 0,
- "REG_SZ",
- REG_OPTION_NON_VOLATILE,
- KEY_ALL_ACCESS,
- 0,
- &hKey,
- &dwDisposition);
-
- if (!lError) {
- //Set the server name.
- lError = RegSetValueExA(hKey,
- "",
- 0,
- REG_SZ,
- (const unsigned char *)szServer,
- strlen(szServer) + 1);
-
- RegFlushKey(hKey);
- RegCloseKey(hKey);
- }
- RegCloseKey(hKeyClassID);
- }
- RegCloseKey(hKeyCLSID);
- }
-
- if (!lError)
- hr = S_OK;
- else
- hr = HRESULT_FROM_WIN32(lError);
-
- return hr;
- }
-
-
- HRESULT UnregisterLocalServer(REFCLSID rclsid)
- {
- HRESULT hr;
- HKEY hKeyCLSID;
- HKEY hKeyClassID;
- long lError;
- char szClassID[39];
-
- //open the CLSID key
- lError = RegOpenKeyExA(
- HKEY_CLASSES_ROOT,
- "CLSID",
- 0,
- KEY_ALL_ACCESS,
- &hKeyCLSID);
-
- if (!lError) {
- //convert the class ID to a registry key name.
- sprintf(szClassID,
- "{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
- rclsid.Data1, rclsid.Data2, rclsid.Data3,
- rclsid.Data4[0], rclsid.Data4[1],
- rclsid.Data4[2], rclsid.Data4[3],
- rclsid.Data4[4], rclsid.Data4[5],
- rclsid.Data4[6], rclsid.Data4[7]);
-
- //open registry key for class ID string
- lError = RegOpenKeyExA(
- hKeyCLSID,
- szClassID,
- 0,
- KEY_ALL_ACCESS,
- &hKeyClassID);
-
- if (!lError) {
- //delete LocalServer32 key.
- lError = RegDeleteKeyA(hKeyClassID, "LocalServer32");
- RegCloseKey(hKeyClassID);
- }
-
- lError = RegDeleteKeyA(hKeyCLSID, szClassID);
- RegCloseKey(hKeyCLSID);
- }
-
- if (!lError)
- hr = S_OK;
- else
- hr = HRESULT_FROM_WIN32(lError);
-
- return hr;
- }
-
-