home *** CD-ROM | disk | FTP | other *** search
/ ActiveX Programming Unleashed CD / AXU.iso / source / chap03 / lst32 / lst32.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-09-23  |  6.2 KB  |  252 lines

  1.  
  2. #include "lstr.h"
  3.  
  4. long    g_cLock = -1;
  5. long    g_ObjectCount = 0;
  6.  
  7.  
  8. long    g_fClassRegistered  = FALSE;
  9. DWORD   g_dwRegister        = 0;
  10.  
  11.  
  12. HRESULT RegisterClassFactory()
  13. {
  14.     HRESULT hr;
  15.     CLowerStrClassFactory *pClassFactory;
  16.  
  17.     pClassFactory = new CLowerStrClassFactory;
  18.         
  19.     if (pClassFactory != 0) 
  20.     {
  21.         hr = CoRegisterClassObject(CLSID_CLowerStr,
  22.                                       (IUnknown *) pClassFactory,
  23.                                    CLSCTX_LOCAL_SERVER,
  24.                                    REGCLS_SINGLEUSE,
  25.                                    &g_dwRegister);
  26.         pClassFactory->Release();
  27.         hr = S_OK;
  28.     }
  29.     else 
  30.     {
  31.         hr = E_OUTOFMEMORY;
  32.     }
  33.   
  34.     return hr;  
  35. }
  36.  
  37.  
  38. HRESULT RevokeClassFactory()
  39. {
  40.     HRESULT hr;
  41.     
  42.     hr = CoRevokeClassObject(g_dwRegister);
  43.  
  44.     return hr;
  45. }
  46.  
  47. void main(int argc, char *argv[])
  48. {
  49.     HRESULT hr = S_OK;
  50.     int i;
  51.     BOOL bRegisterServer = FALSE;
  52.     BOOL bUnregisterServer = FALSE;
  53.     MSG msg;
  54.  
  55.  
  56.     for (i = 1; i < argc; i++) 
  57.     {
  58.         if (_stricmp( argv[i], "/REGSERVER" ) == 0) {
  59.             bRegisterServer = TRUE;
  60.         }
  61.         else if (_stricmp( argv[i], "/UNREGSERVER" ) == 0) {
  62.             bUnregisterServer = TRUE;
  63.         }
  64.     }
  65.  
  66.     if(bRegisterServer)
  67.     {
  68.         RegisterLocalServer(CLSID_CLowerStr);
  69.         return;
  70.     }
  71.  
  72.     if(bUnregisterServer)
  73.     {
  74.         UnregisterLocalServer(CLSID_CLowerStr);
  75.         return;
  76.     }
  77.  
  78.     hr = CoInitialize(NULL);
  79.  
  80.     if (FAILED(hr)) {
  81.         printf("CoInitialize failed [0x%x].\n", hr);
  82.         return;
  83.     }
  84.  
  85.     hr = RegisterClassFactory();
  86.     if (SUCCEEDED(hr)) 
  87.     {
  88.         printf("Waiting for client to connect...\n");
  89.  
  90.         while (GetMessage(&msg, NULL, 0, 0)) 
  91.         {
  92.             TranslateMessage(&msg);
  93.             DispatchMessage(&msg);
  94.         }
  95.  
  96.         RevokeClassFactory();
  97.     }
  98.     else 
  99.     {
  100.         printf("Failed to register class factory [0x%x].\n", hr);
  101.     }
  102.  
  103.     CoUninitialize();
  104.     
  105.     return;
  106. }
  107.  
  108.  
  109. HRESULT RegisterLocalServer(REFCLSID rclsid)
  110. {
  111.     HRESULT hr;
  112.     LONG lError;
  113.     HKEY hKeyCLSID;       
  114.     HKEY hKeyClassID;
  115.     HKEY hKey;              // current key
  116.     DWORD dwDisposition;
  117.     char szServer[MAX_PATH];
  118.     char szClassID[39];
  119.     ULONG ulLength;
  120.  
  121.     ulLength = GetModuleFileNameA(0, szServer, sizeof(szServer));
  122.  
  123.     if (ulLength == 0) 
  124.     {
  125.         hr = HRESULT_FROM_WIN32(GetLastError());
  126.         return hr;
  127.     }
  128.  
  129.     //create the CLSID key
  130.     lError = RegCreateKeyExA(
  131.             HKEY_CLASSES_ROOT, 
  132.             "CLSID",
  133.             0, 
  134.             "REG_SZ", 
  135.             REG_OPTION_NON_VOLATILE,
  136.             KEY_ALL_ACCESS,
  137.             0,
  138.             &hKeyCLSID,
  139.             &dwDisposition);
  140.  
  141.     if (!lError) {
  142.         //convert the class ID to a registry key name.
  143.         sprintf(szClassID,
  144.                 "{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
  145.                 rclsid.Data1, rclsid.Data2, rclsid.Data3,
  146.                 rclsid.Data4[0], rclsid.Data4[1],
  147.                 rclsid.Data4[2], rclsid.Data4[3],
  148.                 rclsid.Data4[4], rclsid.Data4[5],
  149.                 rclsid.Data4[6], rclsid.Data4[7]);
  150.   
  151.         //create key for the server class
  152.         lError = RegCreateKeyExA(hKeyCLSID, 
  153.                                 szClassID,
  154.                                 0, 
  155.                                 "REG_SZ", 
  156.                                 REG_OPTION_NON_VOLATILE,
  157.                                 KEY_ALL_ACCESS,
  158.                                 0,
  159.                                 &hKeyClassID,
  160.                                 &dwDisposition);
  161.  
  162.         if (!lError) {
  163.             //create LocalServer32 key.
  164.             lError = RegCreateKeyExA(hKeyClassID,           
  165.                                     "LocalServer32",
  166.                                     0, 
  167.                                     "REG_SZ", 
  168.                                     REG_OPTION_NON_VOLATILE,
  169.                                     KEY_ALL_ACCESS,
  170.                                     0,            
  171.                                     &hKey,
  172.                                     &dwDisposition);
  173.  
  174.             if (!lError) {
  175.                 //Set the server name.
  176.                 lError = RegSetValueExA(hKey, 
  177.                                        "", 
  178.                                        0, 
  179.                                        REG_SZ, 
  180.                                        (const unsigned char *)szServer,
  181.                                        strlen(szServer) + 1);
  182.  
  183.                 RegFlushKey(hKey);
  184.                 RegCloseKey(hKey);
  185.             }
  186.             RegCloseKey(hKeyClassID);
  187.         }
  188.         RegCloseKey(hKeyCLSID);
  189.     }
  190.  
  191.     if (!lError)
  192.         hr = S_OK;
  193.     else
  194.         hr = HRESULT_FROM_WIN32(lError);
  195.  
  196.     return hr;
  197. }
  198.  
  199.  
  200. HRESULT UnregisterLocalServer(REFCLSID rclsid)
  201. {
  202.     HRESULT hr;
  203.     HKEY hKeyCLSID;
  204.     HKEY hKeyClassID;
  205.     long lError;
  206.     char szClassID[39];
  207.  
  208.     //open the CLSID key
  209.     lError = RegOpenKeyExA(
  210.                 HKEY_CLASSES_ROOT, 
  211.                 "CLSID",
  212.                 0, 
  213.                 KEY_ALL_ACCESS,
  214.                 &hKeyCLSID);
  215.  
  216.     if (!lError) { 
  217.         //convert the class ID to a registry key name.
  218.         sprintf(szClassID,
  219.                 "{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
  220.                 rclsid.Data1, rclsid.Data2, rclsid.Data3,
  221.                 rclsid.Data4[0], rclsid.Data4[1],
  222.                 rclsid.Data4[2], rclsid.Data4[3],
  223.                 rclsid.Data4[4], rclsid.Data4[5],
  224.                 rclsid.Data4[6], rclsid.Data4[7]);
  225.  
  226.         //open registry key for class ID string
  227.         lError = RegOpenKeyExA(
  228.                 hKeyCLSID, 
  229.                 szClassID,
  230.                 0, 
  231.                 KEY_ALL_ACCESS,
  232.                 &hKeyClassID);
  233.  
  234.         if (!lError) {
  235.             //delete LocalServer32 key. 
  236.             lError = RegDeleteKeyA(hKeyClassID, "LocalServer32");
  237.             RegCloseKey(hKeyClassID);          
  238.         }
  239.  
  240.         lError = RegDeleteKeyA(hKeyCLSID, szClassID);
  241.         RegCloseKey(hKeyCLSID);
  242.     }
  243.  
  244.     if (!lError)
  245.         hr = S_OK;
  246.     else
  247.         hr = HRESULT_FROM_WIN32(lError);
  248.  
  249.     return hr;
  250. }
  251.  
  252.