1、#define SAFE_FREESTRING(s)        if (s) { DsoMemFree(s); (s) = NULL; }2、STDAPI_(LPWSTR) ConvertToLPWSTR(LPCSTR pszMbcsString)3、主要是这个部分
LPCLSID lpMyList = NULL;
int nMyCount = 0;
int nMyLen = 0;HKEY hkCLSID;
HKEY hkItem;
HKEY hkDocObject;
DWORD dwIndex = 0;
CHAR szName[MAX_PATH+1];    if (RegOpenKeyEx(HKEY_CLASSES_ROOT, "CLSID", 0, KEY_READ|KEY_ENUMERATE_SUB_KEYS, &hkCLSID) == ERROR_SUCCESS)
{
while (RegEnumKey(hkCLSID, dwIndex++, szName, MAX_PATH) == ERROR_SUCCESS)
{
if (RegOpenKeyEx(hkCLSID, szName, 0, KEY_READ, &hkItem) == ERROR_SUCCESS)
{
if ((RegOpenKeyEx(hkItem, "DocObject", 0, KEY_READ, &hkDocObject) != ERROR_SUCCESS))
{
CLSID clsid;
LPWSTR pwszClsid = ConvertToLPWSTR(szName);
if ((pwszClsid) && SUCCEEDED(CLSIDFromString(pwszClsid, &clsid)))
{
if (lpMyList == NULL)
{
nMyCount = 0;
nMyLen = 16;
lpMyList = My CLSID[nMyLen];
}
if (nMyCount == nMyLen)
{
LPCLSID lpOldList = lpMyList;
nMyLen <<= 2;
lpMyList = My CLSID[nMyLen];
memcpy(lpMyList, lpOldList, sizeof(CLSID) * nMyCount);
delete [] lpOldList;
} lpMyList[nMyCount] = clsid;
nMyCount++;
}
SAFE_FREESTRING(pwszClsid);
RegCloseKey(hkDocObject);
}
    
RegCloseKey(hkItem);
}
}
RegCloseKey(hkCLSID);
}

解决方案 »

  1.   

    function WideStringToString(const ws: WideString; codePage: Word): AnsiString;
    var
      l: integer;
    begin
      if ws = ' then
        Result := '
      else 
      begin
        l := WideCharToMultiByte(codePage,
          WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
          @ws[1], - 1, nil, 0, nil, nil);
        SetLength(Result, l - 1);
        if l > 1 then
          WideCharToMultiByte(codePage,
            WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
            @ws[1], - 1, @Result[1], l - 1, nil, nil);
      end;
    end; function StringToWideString(const s: AnsiString; codePage: Word): WideString;
    var
      l: integer;
    begin
      if s = ' then
        Result := '
      else 
      begin
        l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PChar(@s[1]), - 1, nil, 0);
        SetLength(Result, l - 1);
        if l > 1 then
          MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PChar(@s[1]),
            - 1, PWideChar(@Result[1]), l - 1);
      end;
    end;