描述:
if (item == dsoDialogNew)
{
OLEUIINSERTOBJECT oidlg = {0};
LPCLSID lpNewExcludeList = NULL;
int nNewExcludeCount = 0;
int nNewExcludeLen = 0;
oidlg.cbStruct = sizeof(OLEUIINSERTOBJECT);
oidlg.dwFlags = IOF_SELECTCREATENEW | IOF_DISABLELINK | IOF_DISABLEDISPLAYASICON | IOF_HIDECHANGEICON;
oidlg.hWndOwner = m_hwnd;
oidlg.lpszCaption = "Insert New Document Object";
oidlg.lpszFile = szFile;
oidlg.cchFile = MAX_PATH;
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, "Insertable", 0, KEY_READ, &hkDocObject) == ERROR_SUCCESS))
{
RegCloseKey(hkDocObject);
if ((RegOpenKeyEx(hkItem, "DocObject", 0, KEY_READ, &hkDocObject) != ERROR_SUCCESS))
{
CLSID clsid;
LPWSTR pwszClsid = ConvertToLPWSTR(szName);
if ((pwszClsid) && SUCCEEDED(CLSIDFromString(pwszClsid, &clsid)))
{
if (lpNewExcludeList == NULL)
{
nNewExcludeCount = 0;
nNewExcludeLen = 16;
lpNewExcludeList = new CLSID[nNewExcludeLen];
}
if (nNewExcludeCount == nNewExcludeLen)
{
LPCLSID lpOldList = lpNewExcludeList;
nNewExcludeLen <<= 2;
lpNewExcludeList = new CLSID[nNewExcludeLen];
memcpy(lpNewExcludeList, lpOldList, sizeof(CLSID) * nNewExcludeCount);
delete [] lpOldList;
}
lpNewExcludeList[nNewExcludeCount] = clsid;
nNewExcludeCount++;
}
MemFree(pwszClsid);
} else RegCloseKey(hkDocObject);
}
RegCloseKey(hkItem);
}
}
RegCloseKey(hkCLSID);
}
oidlg.lpClsidExclude = lpNewExcludeList;
oidlg.cClsidExclude = nNewExcludeCount;
if (OleUIInsertObject(&oidlg) == OLEUI_OK)
{
if ((oidlg.dwFlags & IOF_SELECTCREATENEW) && (oidlg.clsid != GUID_NULL))
{
LPOLESTR posz;
BSTR bstr;
if (SUCCEEDED(ProgIDFromCLSID(oidlg.clsid, &posz)))
{
bstr = SysAllocString(posz);
hr = CreateNew(bstr);
SysFreeString(bstr);
CoTaskMemFree(posz);
}
}
else if ((oidlg.dwFlags & IOF_SELECTCREATEFROMFILE) && (szFile[0] != 0))
{
vT[0].vt = VT_BSTR;
vT[0].bstrVal = ConvertToBSTR(szFile);
vT[1].vt = VT_I4; vT[1].lVal = 1;
hr = Open(vT[0], vT[1], vT[2], vT[2], vT[2]);
VariantClear(&vT[0]);
}
else
{
MessageBeep(0);
}
}
if (lpNewExcludeList)
delete [] lpNewExcludeList;
}