PRB: MMC Samples/Tutorials Does Not Work on Windows 95

Last reviewed: March 10, 1998
Article ID: Q182220
The information in this article applies to:
  • Microsoft Management Console, version 1.0 on the following platform:

        - Windows 95
    

SYMPTOMS

The Microsoft Management Console SnapIn samples do not execute on Windows 95 when they are compiled using the UNICODE switch. Snap-Ins compiled as UNICODE-only do not register themselves properly on Windows 95. Windows 95 does not support UNICODE. Therefore, the samples must be modified to support ANSI strings when calling Win32 APIs.

CAUSE

The Registry APIs on Windows 95 do not support UNICODE strings.

RESOLUTION

You can modify the samples to allow them to run on Windows 95 using ANSI strings. To do this:

  1. In the DllRegisterServer and DllUnregisterServer functions, change the way the string constants are declared. Use the _T("") macro to define the string constants sent the Reg* APIs. For example:

          nErr = RegOpenKey( HKEY_LOCAL_MACHINE,
    
                             L"Software\\Microsoft\\MMC\\SnapIns",
                             &hMmcParentKey);
    
       Should be changed to:
    
          nErr = RegOpenKey( HKEY_LOCAL_MACHINE,
                             _T("Software\\Microsoft\\MMC\\SnapIns"),
                             &hMmcParentKey);
    
       The _T("") macro will be expanded to the appropriate string constant
       based on the UNICODE switch.
    
    

  2. In the DisplayError function, change it to accept and use LPTSTR string types.

  3. Change all references to ATLTRACE to use the _T("") macro to define text constants. To find these references, use the Find In Files command from the Edit menu and then click each entry in the Find In Files list. Several of the .cpp files use this macro to display trace messages in the results window of Visual C++.

  4. In the CDataObject constructor, calls are made to RegisterClipboardFormat. The standard definitions in the MMC.h file define all of the clipboard format strings in UNICODE. These strings must be converted to ASCIIZ strings when the UNICODE switch is turned off. You can use conditional compilation to insure that the strings passed to RegisterClipboardFormat are the correct type. The CDataObject::CDataObject function was changed to read as follows:

          // These are the clipboard formats that you must supply at a minimum.
          // MMC.h actually defined these. You can make up your own to use for
          // other reasons. You don't need any others at this time.
          //
          // For ANSI, convert the format labels to ANSI if UNICODE
          // is not defined.
          // Leave them alone if they are OK.
          //
          #ifndef UNICODE
    
             //
             // If you are building an ANSI project, the
             // RegisterClipboardFormat strings must be ANSI.  From the MMC
             // headers, the strings are UNICODE and they must be converted to
             // ANSI in order to register them properly.
             //
             // Use conditional compilation to get the job done.
             //
             char buffer[256];
             wcstombs( buffer, CF_SNAPIN_INTERNAL,
                       wcslen(CF_SNAPIN_INTERNAL)+1);
             s_cfInternal    = RegisterClipboardFormat((LPCSTR)buffer);
             wcstombs( buffer, CCF_DISPLAY_NAME, wcslen(CCF_DISPLAY_NAME)+1);
             s_cfDisplayName = RegisterClipboardFormat((LPCSTR)buffer);
             wcstombs( buffer, CCF_NODETYPE, wcslen(CCF_NODETYPE)+1);
             s_cfNodeType    = RegisterClipboardFormat((LPCSTR)buffer);
             wcstombs( buffer, CCF_SNAPIN_CLASSID,
                       wcslen(CCF_SNAPIN_CLASSID)+1);
             s_cfSnapinClsid = RegisterClipboardFormat((LPCSTR)buffer);
          #else
             //
             // UNICODE is defined, the clipboard formats will be OK.
    
             //
             s_cfInternal = RegisterClipboardFormat( CF_SNAPIN_INTERNAL);
             s_cfDisplayName = RegisterClipboardFormat(CCF_DISPLAY_NAME);
             s_cfNodeType    = RegisterClipboardFormat(CCF_NODETYPE);
             s_cfSnapinClsid = RegisterClipboardFormat(CCF_SNAPIN_CLASSID);
          #endif
    
    

  5. As a general rule, use LPTSTR to define the strings pointers used in Win32 API calls. Use the _T("") macro for all text constants.

  6. Use OLESTR inside the SnapIn. Microsoft Management Console expects UNICODE strings and will perform conversions as necessary.

STATUS

Microsoft is researching this problem and will post new information here in the Microsoft Knowledge Base and http://www.microsoft.com/management as it becomes available.

MORE INFORMATION

Microsoft Management Console is a user interface framework. Microsoft Management Console does not provide any additional APIs to assist in administering users, machines, or network resources from Windows 95. SnapIns are limited to the functionality available on the target operating system. When developing a SnapIn that will target both Windows NT and Windows 95, you need to insure that the SnapIn does not use OS specific methods to accomplish a task.

REFERENCES

Samples distributed via the ISysMgmt.exe and IBLDEnv.exe self-extracting zip files through the Platform SDK (http://www.microsoft.com/management) and Microsoft Management Console (http://www.microsoft.com/msdn/sdk/platform.htm) Web sites.


Additional query words: MMC, mmc, samples, tutorial,
Keywords : kbMmc
Version : WINDOWS:1.0
Platform : WINDOWS
Issue type : kbprb


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: March 10, 1998
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.