Ali Hojjati Ответов: 2

Расширение оболочки Windows


Я написал расширение оболочки с помощью c++, но после выполнения щелчка правой кнопкой мыши после 30 раз меню windows становится черным, и мне приходится сбросить explorer.exe
Как я могу предотвратить эту проблему, а также у меня есть более 60 пунктов в моем меню оболочки.

Что я уже пробовал:

Я написал меню оболочки на основе примера Microsoft и до сих пор не добился успеха.

[Правка Йохена Арндта: код, опубликованный в качестве решения и комментария]
#include "MyAdvancedMenuContextMenuHandler.h"
#include <iostream>
#include <fstream>
#include <atlstr.h>
#include <stdio.h>
#include "sqlite3.h"
#include <tchar.h>
#include <Windows.h>
#include <ShlObj.h>
#include <strsafe.h>
#include <direct.h>

using namespace std;

#define DB "C:\\ProgramData\\DataBase.db"
sqlite3 *dbfile;
bool isOpenDB = false;
UINT FirstID = 0;

#define IDM_DISPLAY             0  // The command's identifier offset

HDC hdcSrc, hdcDst;
HBITMAP hbmOld;
HBITMAP	hbmNew;
BITMAP bm;
COLORREF clrTP, clrBK;

MyAdvancedMenuContexthandler::~MyAdvancedMenuContexthandler()
{
	InterlockedDecrement(&g_cObjCount);
}

MyAdvancedMenuContexthandler::MyAdvancedMenuContexthandler() : m_ObjRefCount(1)
{
	InterlockedIncrement(&g_cObjCount);
}

ULONG MyAdvancedMenuContexthandler::AddRef()
{
	return InterlockedIncrement(&m_ObjRefCount);
}

ULONG MyAdvancedMenuContexthandler::Release()
{
	ULONG returnValue = InterlockedDecrement(&m_ObjRefCount);
	if (returnValue < 1)
	{
		delete this;
	}
	return returnValue;
}

HRESULT MyAdvancedMenuContexthandler::QueryInterface(REFIID riid, void **ppvObject)
{
	if (!ppvObject)
		return E_POINTER;
	*ppvObject = NULL;

	if (IsEqualIID(riid, IID_IUnknown))
	{
		*ppvObject = this;
		this->AddRef();
		return S_OK;
	}
	else if (IsEqualIID(riid, IID_IContextMenu))
	{
		*ppvObject = (IContextMenu*) this;
		this->AddRef();
		return S_OK;
	}
	else if (IsEqualIID(riid, IID_IShellExtInit))
	{
		*ppvObject = (IShellExtInit*) this;
		this->AddRef();
		return S_OK;
	}
	else
	{
		return E_NOINTERFACE;
	}
	return E_NOTIMPL;
}

HRESULT MyAdvancedMenuContexthandler::Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pDataObj, HKEY hkeyProgID)
{
	if (NULL == pDataObj)
    {
        return E_INVALIDARG;
    }

    HRESULT hr = E_FAIL;

    FORMATETC fe = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
    STGMEDIUM stm;

    // The pDataObj pointer contains the objects being acted upon. In this 
    // example, we get an HDROP handle for enumerating the selected files and 
    // folders.
    if (SUCCEEDED(pDataObj->GetData(&fe, &stm)))
    {
        // Get an HDROP handle.
        HDROP hDrop = static_cast<HDROP>(GlobalLock(stm.hGlobal));
        if (hDrop != NULL)
        {
            // Determine how many files are involved in this operation. This 
            // code sample displays the custom context menu item when only 
            // one file is selected. 
            UINT nFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
            if (nFiles == 1)
            {

                // Get the path of the file.
                if (0 != DragQueryFile(hDrop, 0, m_szSelectedFile, 
                    ARRAYSIZE(m_szSelectedFile)))
                {
					wchar_t szMessage[300];
					if (SUCCEEDED(StringCchPrintf(szMessage, ARRAYSIZE(szMessage), 
						L"The selected file is:\r\n\r\n%s", this->m_szSelectedFile)))
						{
							//MessageBox(NULL, szMessage, L"CppShellExtContextMenuHandler", MB_OK);
						}
                    hr = S_OK;
                }
            }

            GlobalUnlock(stm.hGlobal);
        }

        ReleaseStgMedium(&stm);
    } 

    // If any value other than S_OK is returned from the method, the context 
    // menu item is not displayed.
    return S_OK;
}

HRESULT MyAdvancedMenuContexthandler::GetCommandString(UINT_PTR idCmd, UINT uFlags, UINT * pwReserved, LPSTR pszName, UINT cchMax)
{
	return E_NOTIMPL;
}

HRESULT MyAdvancedMenuContexthandler::InvokeCommand(LPCMINVOKECOMMANDINFO pici)
{
	/*wchar_t szMessage[300];
	StringCchPrintf(szMessage, ARRAYSIZE(szMessage), L"The selected file is:\r\n\r\n%s", this->m_szSelectedFile);*/
	//MessageBox(NULL, m_szSelectedFile, L"CppShellExtContextMenuHandler", MB_OK);
	//system("notepad.exe");
	PCSTR m_pszVerb;
	//	StrCmpIA(pici->lpVerb, m_pszVerb);

	LPWSTR wszPath = NULL;
	HRESULT hr_FilePath;

	hr_FilePath = SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, NULL, &wszPath);

	wstring _PackName_10(L"\\2.2.0.0\\command.cmd");
	wstring _Path_0(wszPath);
	_Path_0 = _Path_0 + _PackName_10;

	wofstream _writer(_Path_0);
	if (_writer.is_open())
	{
		if ((UINT)pici->lpVerb < 50)
		{
			//MessageBox(NULL, (LPCWSTR)pici->lpVerb, L"Code", MB_OK);
			//MessageBox(NULL, (LPCWSTR)m_szSelectedFile, L"Code", MB_OK);

			UINT _Code = (UINT)pici->lpVerb;
			if (_Code == 1) //Icon Library
			{
				_writer << m_szSelectedFile;
				_writer << "|";
				_writer << 3;
				_writer << "|0" << endl;
			}
			else if (_Code == 2) //Icon File Library
			{
				_writer << m_szSelectedFile;
				_writer << "|";
				_writer << 4;
				_writer << "|0" << endl;
			}
			else if (_Code == 3) //Icon File Library
			{
				_writer << m_szSelectedFile;
				_writer << "|";
				_writer << 7;
				_writer << "|0" << endl;
			}
			else if (_Code == 4) //Icon File Library
			{
				_writer << m_szSelectedFile;
				_writer << "|";
				_writer << 5;
				_writer << "|0" << endl;
			}
			else if (_Code == 5) //Icon File Library
			{
				_writer << m_szSelectedFile;
				_writer << "|";
				_writer << 6;
				_writer << "|0" << endl;
			}
			else if (_Code == 7) //Icon File Library
			{
				_writer << m_szSelectedFile;
				_writer << "|";
				_writer << 9;
				_writer << "|0" << endl;
			}
			else if (_Code == 8) //Icon File Library
			{
				_writer << m_szSelectedFile;
				_writer << "|";
				_writer << 8;
				_writer << "|0" << endl;
			}
			else if (_Code == 9) //Icon File Library
			{
				_writer << m_szSelectedFile;
				_writer << "|";
				_writer << 0;
				_writer << "|0" << endl;
			}
		}
		else
		{
		_writer << m_szSelectedFile;
		_writer << "|" << 1;
		_writer << "|";
		_writer << (UINT)pici->lpVerb - 50 << endl;
		}
	}
	_writer.close();
	//LPWSTR wszPath_ = NULL;
	////SHGetKnownFolderPath(FOLDERID_, 0, NULL, &wszPath_);


	//char the_patha[256];
	//_getcwd(the_patha, 255);

	//size_t nSize1 = 1 + strlen(the_patha);

 //   LPWSTR wUserName = new WCHAR[nSize1];

 //   MultiByteToWideChar(CP_ACP, 0, the_patha, -1, wUserName, nSize1);

	///*LPWSTR _Base = NULL;
	//MultiByteToWideChar(CP_ACP, 0, the_patha, -1, _Base, 0);*/

	//MessageBox(NULL, wUserName, L"Test", MB_OK);
	//wstring _Path_44(wUserName);
	//_Path_44 = _Path_44 + L"\\Change\\ChangeIcon.exe";
	//ShellExecute( NULL, NULL, (LPWSTR)_Path_44.c_str(), NULL, NULL, SW_SHOW );
	
	/*std::wstring prefix (L"");
	wstring _Fol(m_szSelectedFile);
	if(_Fol.substr(0, prefix.size()) != prefix) {
		
	}*/

	wstring _PackName_11(L"\\2.2.0.0\\change.pck");
	wstring _Path_10(wszPath);
	_Path_10 = _Path_10 + _PackName_11;
	ifstream reader_1(_Path_10);
	// Get The Value
	wstring _PackName((std::istreambuf_iterator<char>(reader_1)),
			(std::istreambuf_iterator<char>()) );

	//MessageBox(NULL, (LPWSTR)_PackName.c_str(), L"", MB_OK);

	ShellExecute( NULL, NULL, (LPWSTR)_PackName.c_str(), NULL, NULL, SW_SHOW );
	//return S_OK;
	
	return E_NOTIMPL;
}

HBITMAP MakeBitMapTransparent(HBITMAP hbmSrc)
{
	if ((hdcSrc = CreateCompatibleDC(NULL)) != NULL) {
		if ((hdcDst = CreateCompatibleDC(NULL)) != NULL) {
			int nRow, nCol;
			GetObject(hbmSrc, sizeof(bm), &bm);
			hbmOld = (HBITMAP)SelectObject(hdcSrc, hbmSrc);
			hbmNew = CreateBitmap(bm.bmWidth, bm.bmHeight, bm.bmPlanes, bm.bmBitsPixel, NULL);
			SelectObject(hdcDst, hbmNew);
			
			BitBlt(hdcDst,0,0,bm.bmWidth, bm.bmHeight,hdcSrc,0,0,SRCCOPY);

			clrTP = GetPixel(hdcDst, 0, 15);// Get color of first pixel at 0,0
			clrBK = GetSysColor(COLOR_MENU);// Get the current background color of the menu
			
			for (nRow = 0; nRow < bm.bmHeight; nRow++)// work our way through all the pixels changing their color
				for (nCol = 0; nCol < bm.bmWidth; nCol++)// when we hit our set transparency color.
					if (GetPixel(hdcDst, nCol, nRow) == clrTP)
						SetPixel(hdcDst, nCol, nRow, clrBK);
			
			DeleteDC(hdcDst);
		}
		DeleteDC(hdcSrc);
		
	}
	return hbmNew;// return our transformed bitmap.
}

HBITMAP GETICON(string _name)
{
	string _iName = "C:\\ProgramData\\2.2.0.0\\icons\\" + _name + ".bmp";
	CString _iNameIcon = _iName.c_str();
	LPWSTR _IconPath = _iNameIcon.GetBuffer(0);
	HBITMAP iconHandle = (HBITMAP)LoadImageW(NULL, _IconPath, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADTRANSPARENT | LR_LOADFROMFILE); MENUITEMINFOW contextEntryAppSuite = { sizeof(contextEntryAppSuite) };
	return MakeBitMapTransparent(iconHandle);
}

HBITMAP GETICONTrans(string _name)
{
	string _iName = "C:\\ProgramData\\2.2.0.0\\shell\\" + _name + ".bmp";
	CString _iNameIcon = _iName.c_str();
	LPWSTR _IconPath = _iNameIcon.GetBuffer(0);
	HBITMAP iconHandle = (HBITMAP)LoadImageW(NULL, _IconPath, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADTRANSPARENT | LR_LOADFROMFILE); MENUITEMINFOW contextEntryAppSuite = { sizeof(contextEntryAppSuite) };
	return MakeBitMapTransparent(iconHandle);
}

HRESULT MyAdvancedMenuContexthandler::QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
{
	if (uFlags & CMF_DEFAULTONLY)
		return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 0);

	HMENU subMenus = CreatePopupMenu();
	
	HMENU customPack_01 = CreatePopupMenu();
	HMENU customPack_02 = CreatePopupMenu();
	HMENU customPack_03 = CreatePopupMenu();
	HMENU customPack_04 = CreatePopupMenu();
	HMENU settingMenu_1 = CreatePopupMenu();
	
	FirstID = idCmdFirst;

	// Read Selected Packs for the Menu
	
	//sqlite3_open(DB, &dbfile);

	if ( sqlite3_open(DB, &dbfile) == SQLITE_OK )
	{
		//MessageBox(NULL, L"Connected Successfully", L"Connection", MB_OK);
	}


	UINT _bigID = 0;

	LPWSTR wszPath = NULL;
	HRESULT hr_FilePath;

	hr_FilePath = SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, NULL, &wszPath);

	wstring _PackName_10(L"\\2.2.0.0\\Default_0.pck");
	wstring _PackName_11(L"\\2.2.0.0\\Default_1.pck");
	wstring _PackName_12(L"\\2.2.0.0\\Default_2.pck");
	wstring _PackName_13(L"\\2.2.0.0\\Default_3.pck");
	wstring _PackName_14(L"\\2.2.0.0\\Default_4.pck");


	string _PackName_0 = "";
	string _PackName_1 = "";
	string _PackName_2 = "";
	string _PackName_3 = "";
	string _PackName_4 = "";

	wstring _Path_0(wszPath);
	_Path_0 = _Path_0 + _PackName_10;
	wstring _Path_1(wszPath);
	_Path_1 = _Path_1 + _PackName_11;
	wstring _Path_2(wszPath);
	_Path_2 = _Path_2 + _PackName_12;
	wstring _Path_3(wszPath);
	_Path_3 = _Path_3 + _PackName_13;
	wstring _Path_4(wszPath);
	_Path_4 = _Path_4 + _PackName_14;
		
	ifstream reader_1(_Path_1);

	// Get The Value
	string _PackName((std::istreambuf_iterator<char>(reader_1)),
			(std::istreambuf_iterator<char>()) );

	if (_PackName != "")
	{
		// Custom Pack One
		_PackName_1 = _PackName;

		sqlite3_stmt *statement;

		string _q = "select ID,clmShell,clmTitle from vShellIcons where clmName Like '" + _PackName + "' and clmInShell=1";
		char *cstr = new char[_q.length() + 1];
		strcpy_s(cstr,_q.length() + 1 ,_q.c_str());

		char *query = cstr;
		if ( sqlite3_prepare(dbfile, query, -1, &statement, 0 ) == SQLITE_OK ) 
		{
			
			int res = 0;

			while ( 1 ) 		
			{
				res = sqlite3_step(statement);
				if ( res == SQLITE_ROW ) 
				{
					string _sName = (char*)sqlite3_column_text(statement, 2);
					MENUITEMINFO subMenu_1_1 = {};
					subMenu_1_1.cbSize = sizeof(MENUITEMINFO);
					subMenu_1_1.wID = idCmdFirst + sqlite3_column_int(statement, 0) + 50;
					CString _NameIcon = _sName.c_str();
					subMenu_1_1.dwTypeData =  _NameIcon.GetBuffer(0);

					if (_bigID < idCmdFirst + sqlite3_column_int(statement, 0) + 50)
					{
						_bigID = idCmdFirst + sqlite3_column_int(statement, 0) + 50 ;
					}
					
					string _Path = (char*)sqlite3_column_text(statement, 1);
					string _iName = "C:\\ProgramData\\2.2.0.0\\shell\\" + _Path + ".bmp";
					CString _iNameIcon = _iName.c_str();
					LPWSTR _IconPath = _iNameIcon.GetBuffer(0);
					subMenu_1_1.fMask =  MIIM_STRING | MIIM_STATE | MIIM_BITMAP | MIIM_FTYPE | MIIM_ID;
					HBITMAP iconHandle = (HBITMAP)LoadImageW(NULL, _IconPath, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADTRANSPARENT | LR_LOADFROMFILE); MENUITEMINFOW contextEntryAppSuite = { sizeof(contextEntryAppSuite) };
					subMenu_1_1.fType = MFT_STRING;
					subMenu_1_1.fState=MFS_ENABLED;
					subMenu_1_1.hbmpItem = MakeBitMapTransparent(iconHandle);
					MENUINFO menuInfo;
					menuInfo.cbSize=sizeof(MENUINFO);
					menuInfo.fMask=MIM_STYLE;
					menuInfo.dwStyle=MNS_CHECKORBMP;
					SetMenuInfo(customPack_01, &menuInfo);
					
					InsertMenuItem(customPack_01, idCmdFirst + sqlite3_column_int(statement,0) + 50, TRUE, &subMenu_1_1);
				}

				if ( res == SQLITE_DONE )	
				{
					break;
				}					
			}
		}
	}
	
	ifstream reader_2(_Path_2);

	// Get The Value
	string _PackName_((std::istreambuf_iterator<char>(reader_2)),
			(std::istreambuf_iterator<char>()) );

	if (_PackName_ != "")
	{
		// Custom Pack One
		_PackName_2 = _PackName_;

		sqlite3_stmt *statement;

		string _q = "select ID,clmShell,clmTitle from vShellIcons where clmName Like '" + _PackName_ + "' and clmInShell=1";
		char *cstr = new char[_q.length() + 1];
		strcpy_s(cstr,_q.length() + 1 ,_q.c_str());

		char *query = cstr;
		if ( sqlite3_prepare(dbfile, query, -1, &statement, 0 ) == SQLITE_OK ) 
		{
			
			int res = 0;

			while ( 1 ) 		
			{
				res = sqlite3_step(statement);
				if ( res == SQLITE_ROW ) 
				{
					string _sName = (char*)sqlite3_column_text(statement, 2);
					MENUITEMINFO subMenu_1_1 = {};
					subMenu_1_1.cbSize = sizeof(MENUITEMINFO);
					subMenu_1_1.wID = idCmdFirst + sqlite3_column_int(statement, 0) + 50;
					CString _NameIcon = _sName.c_str();
					subMenu_1_1.dwTypeData =  _NameIcon.GetBuffer(0);
					subMenu_1_1.fMask = MIIM_STRING | MIIM_STATE | MIIM_BITMAP | MIIM_FTYPE | MIIM_ID;

					
					if (_bigID < idCmdFirst + sqlite3_column_int(statement, 0) + 50)
					{
						_bigID = idCmdFirst + sqlite3_column_int(statement, 0) + 50 ;
					}

					string _Path = (char*)sqlite3_column_text(statement, 1);
					string _iName = "C:\\ProgramData\\2.2.0.0\\shell\\" + _Path + ".bmp";
					CString _iNameIcon = _iName.c_str();
					LPWSTR _IconPath = _iNameIcon.GetBuffer(0);
					HBITMAP iconHandle = (HBITMAP)LoadImageW(NULL, _IconPath, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADTRANSPARENT | LR_LOADFROMFILE); MENUITEMINFOW contextEntryAppSuite = { sizeof(contextEntryAppSuite) };
					//iconHandle = TransparentCopy(iconHandle, RGB(255, 255, 255));
					subMenu_1_1.fType = MFT_STRING;
					subMenu_1_1.fState=MFS_ENABLED;
					subMenu_1_1.hbmpItem=MakeBitMapTransparent(iconHandle);
					MENUINFO menuInfo;
					menuInfo.cbSize=sizeof(MENUINFO);
					menuInfo.fMask=MIM_STYLE;
					menuInfo.dwStyle=MNS_CHECKORBMP;
					SetMenuInfo(customPack_01, &menuInfo);

					InsertMenuItem(customPack_02, idCmdFirst + sqlite3_column_int(statement,0) + 50, TRUE, &subMenu_1_1);
				}

				if ( res == SQLITE_DONE )	
				{
					break;
				}					
			}
		}		
	}

	ifstream reader_3(_Path_3);

	// Get The Value
	string _PackName__((std::istreambuf_iterator<char>(reader_3)),
			(std::istreambuf_iterator<char>()) );

	if (_PackName__ != "")
	{
		// Custom Pack One
		_PackName_3 = _PackName__;

		sqlite3_stmt *statement;

		string _q = "select ID,clmShell,clmTitle from vShellIcons where clmName Like '" + _PackName__ + "' and clmInShell=1";
		char *cstr = new char[_q.length() + 1];
		strcpy_s(cstr,_q.length() + 1 ,_q.c_str());

		char *query = cstr;
		if ( sqlite3_prepare(dbfile, query, -1, &statement, 0 ) == SQLITE_OK ) 
		{
			
			int res = 0;

			while ( 1 ) 		
			{
				res = sqlite3_step(statement);
				if ( res == SQLITE_ROW ) 
				{
					string _sName = (char*)sqlite3_column_text(statement, 2);
					MENUITEMINFO subMenu_1_1 = {};
					subMenu_1_1.cbSize = sizeof(MENUITEMINFO);
					subMenu_1_1.wID = idCmdFirst + sqlite3_column_int(statement, 0) + 50;
					CString _NameIcon = _sName.c_str();
					subMenu_1_1.dwTypeData =  _NameIcon.GetBuffer(0);
					subMenu_1_1.fMask = MIIM_STRING | MIIM_STATE | MIIM_BITMAP | MIIM_FTYPE | MIIM_ID;

					
					if (_bigID < idCmdFirst + sqlite3_column_int(statement, 0) + 50)
					{
						_bigID = idCmdFirst + sqlite3_column_int(statement, 0) + 50;
					}

					string _Path = (char*)sqlite3_column_text(statement, 1);
					string _iName = "C:\\ProgramData\\2.2.0.0\\shell\\" + _Path + ".bmp";
					CString _iNameIcon = _iName.c_str();
					LPWSTR _IconPath = _iNameIcon.GetBuffer(0);
					HBITMAP iconHandle = (HBITMAP)LoadImageW(NULL, _IconPath, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADTRANSPARENT | LR_LOADFROMFILE); MENUITEMINFOW contextEntryAppSuite = { sizeof(contextEntryAppSuite) };
					//iconHandle = TransparentCopy(iconHandle, RGB(255, 255, 255));
					subMenu_1_1.fType = MFT_STRING;
					subMenu_1_1.fState=MFS_ENABLED;
					subMenu_1_1.hbmpItem=MakeBitMapTransparent(iconHandle);
					MENUINFO menuInfo;
					menuInfo.cbSize=sizeof(MENUINFO);
					menuInfo.fMask=MIM_STYLE;
					menuInfo.dwStyle=MNS_CHECKORBMP;
					SetMenuInfo(customPack_01, &menuInfo);
					
					InsertMenuItem(customPack_03, idCmdFirst + sqlite3_column_int(statement,0) + 50, TRUE, &subMenu_1_1);

				}

				if ( res == SQLITE_DONE )	
				{
					break;
				}					
			}
		}
	}
		
	ifstream reader_4(_Path_4);

	// Get The Value
	string _PackName___((std::istreambuf_iterator<char>(reader_4)),
			(std::istreambuf_iterator<char>()) );

	if (_PackName___ != "")
	{
		// Custom Pack One
		_PackName_4 = _PackName___;

		sqlite3_stmt *statement;

		string _q = "select ID,clmShell,clmTitle from vShellIcons where clmName Like '" + _PackName___ + "' and clmInShell=1";
		char *cstr = new char[_q.length() + 1];
		strcpy_s(cstr,_q.length() + 1 ,_q.c_str());

		char *query = cstr;
		if ( sqlite3_prepare(dbfile, query, -1, &statement, 0 ) == SQLITE_OK ) 
		{
			
			int res = 0;

			while ( 1 ) 		
			{
				res = sqlite3_step(statement);
				if ( res == SQLITE_ROW ) 
				{
					string _sName = (char*)sqlite3_column_text(statement, 2);
					MENUITEMINFO subMenu_1_1 = {};
					subMenu_1_1.cbSize = sizeof(MENUITEMINFO);
					subMenu_1_1.wID = idCmdFirst + sqlite3_column_int(statement, 0) + 50;
					CString _NameIcon = _sName.c_str();
					subMenu_1_1.dwTypeData =  _NameIcon.GetBuffer(0);
					subMenu_1_1.fMask = MIIM_STRING | MIIM_STATE | MIIM_BITMAP | MIIM_FTYPE | MIIM_ID;

					
					if (_bigID < idCmdFirst + sqlite3_column_int(statement, 0) + 50)
					{
						_bigID = idCmdFirst + sqlite3_column_int(statement, 0) + 50;
					}

					string _Path = (char*)sqlite3_column_text(statement, 1);
					string _iName = "C:\\ProgramData\\2.2.0.0\\shell\\" + _Path + ".bmp";
					CString _iNameIcon = _iName.c_str();
					LPWSTR _IconPath = _iNameIcon.GetBuffer(0);
					HBITMAP iconHandle = (HBITMAP)LoadImageW(NULL, _IconPath, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADTRANSPARENT | LR_LOADFROMFILE); MENUITEMINFOW contextEntryAppSuite = { sizeof(contextEntryAppSuite) };
					//iconHandle = TransparentCopy(iconHandle, RGB(255, 255, 255));
					subMenu_1_1.fType = MFT_STRING;
					subMenu_1_1.fState=MFS_ENABLED;
					subMenu_1_1.hbmpItem=MakeBitMapTransparent(iconHandle);
					MENUINFO menuInfo;
					menuInfo.cbSize=sizeof(MENUINFO);
					menuInfo.fMask=MIM_STYLE;
					menuInfo.dwStyle=MNS_CHECKORBMP;
					SetMenuInfo(customPack_01, &menuInfo);

					InsertMenuItem(customPack_04, idCmdFirst + sqlite3_column_int(statement,0) + 50, TRUE, &subMenu_1_1);

				}

				if ( res == SQLITE_DONE )	
				{
					break;
				}					
			}
		}
	}

	// Settings Menu
	
	MENUITEMINFO subMenu_5_1 = {};
	subMenu_5_1.cbSize = sizeof(MENUITEMINFO);
	subMenu_5_1.fMask = MIIM_BITMAP | MIIM_STRING | MIIM_ID;
	subMenu_5_1.hbmpItem = GETICON("Tiles_16px");
	subMenu_5_1.wID = idCmdFirst+1;
	subMenu_5_1.dwTypeData = L"Item One";

	MENUITEMINFO subMenu_5_2 = {};
	subMenu_5_2.cbSize = sizeof(MENUITEMINFO);
	subMenu_5_2.fMask = MIIM_BITMAP | MIIM_STRING | MIIM_ID;
	subMenu_5_2.hbmpItem = GETICON("Open_16px");
	subMenu_5_2.wID = idCmdFirst+2;
	subMenu_5_2.dwTypeData = L"Item Two";

	MENUITEMINFO subMenu_5_3 = {};
	subMenu_5_3.cbSize = sizeof(MENUITEMINFO);
	subMenu_5_3.fMask = MIIM_BITMAP | MIIM_STRING | MIIM_ID;
	subMenu_5_3.hbmpItem = GETICON("Windows_16");
	subMenu_5_3.wID = idCmdFirst+3;
	subMenu_5_3.dwTypeData = L"Item Three";

	MENUITEMINFO subMenu_5_4 = {};
	subMenu_5_4.cbSize = sizeof(MENUITEMINFO);
	subMenu_5_4.fMask = MIIM_BITMAP | MIIM_STRING | MIIM_ID;
	subMenu_5_4.hbmpItem = GETICON("Simple_16px");
	subMenu_5_4.wID = idCmdFirst+4;
	subMenu_5_4.dwTypeData = L"Item Four";

	MENUITEMINFO subMenu_5_5 = {};
	subMenu_5_5.cbSize = sizeof(MENUITEMINFO);
	subMenu_5_5.fMask = MIIM_BITMAP | MIIM_STRING | MIIM_ID;
	subMenu_5_5.hbmpItem = GETICON("Advanced_16px");
	subMenu_5_5.wID = idCmdFirst+5;
	subMenu_5_5.dwTypeData = L"Item Five";

	MENUITEMINFO _Split_2 = {};
	_Split_2.cbSize = sizeof(MENUITEMINFO);
	_Split_2.fMask =  MIIM_TYPE;
	_Split_2.fType = MFT_SEPARATOR;
	_Split_2.wID = idCmdFirst+6;
	_Split_2.dwTypeData = L"-";

	MENUITEMINFO subMenu_5_6 = {};
	subMenu_5_6.cbSize = sizeof(MENUITEMINFO);
	subMenu_5_6.fMask = MIIM_BITMAP | MIIM_STRING | MIIM_ID;
	subMenu_5_6.hbmpItem = GETICON("Settings_16px");
	subMenu_5_6.wID = idCmdFirst+7;
	subMenu_5_6.dwTypeData = L"Settings";

	InsertMenuItem(settingMenu_1, idCmdFirst + 1, TRUE, &subMenu_5_1);
	InsertMenuItem(settingMenu_1, idCmdFirst + 2, TRUE, &subMenu_5_2);
	InsertMenuItem(settingMenu_1, idCmdFirst + 3, TRUE, &subMenu_5_3);
	InsertMenuItem(settingMenu_1, idCmdFirst + 4, TRUE, &subMenu_5_4);
	InsertMenuItem(settingMenu_1, idCmdFirst + 5, TRUE, &subMenu_5_5);
	InsertMenuItem(settingMenu_1, idCmdFirst + 6, TRUE, &_Split_2);
	InsertMenuItem(settingMenu_1, idCmdFirst + 7, TRUE, &subMenu_5_6);

	// Final Menu Structure Pack 01
	MENUITEMINFO subMenu_01 = {};
	subMenu_01.cbSize = sizeof(MENUITEMINFO);
	subMenu_01.fMask = MIIM_SUBMENU | MIIM_STRING | MIIM_ID;
	subMenu_01.hSubMenu = customPack_01;
	subMenu_01.wID = idCmdFirst+2;
	CString cStrText_1 = _PackName_1.c_str();
	subMenu_01.dwTypeData = cStrText_1.GetBuffer(0);
	// Final Menu Structure Pack 02
	MENUITEMINFO subMenu_02 = {};
	subMenu_02.cbSize = sizeof(MENUITEMINFO);
	subMenu_02.fMask = MIIM_SUBMENU | MIIM_STRING | MIIM_ID;
	subMenu_02.hSubMenu = customPack_02;
	subMenu_02.wID = idCmdFirst+2;
	CString cStrText_2 = _PackName_2.c_str();
	subMenu_02.dwTypeData = cStrText_2.GetBuffer(0);
    // Final Menu Structure Pack 03
	MENUITEMINFO subMenu_03 = {};
	subMenu_03.cbSize = sizeof(MENUITEMINFO);
	subMenu_03.fMask = MIIM_SUBMENU | MIIM_STRING | MIIM_ID;
	subMenu_03.hSubMenu = customPack_03;
	subMenu_03.wID = idCmdFirst+2;
	CString cStrText_3 = _PackName_3.c_str();
	subMenu_03.dwTypeData = cStrText_3.GetBuffer(0);
    // Final Menu Structure Pack 04
	MENUITEMINFO subMenu_04 = {};
	subMenu_04.cbSize = sizeof(MENUITEMINFO);
	subMenu_04.fMask = MIIM_SUBMENU | MIIM_STRING | MIIM_ID;
	subMenu_04.hSubMenu = customPack_04;
	subMenu_04.wID = idCmdFirst+2;
	CString cStrText_4 = _PackName_4.c_str();
	subMenu_04.dwTypeData = cStrText_4.GetBuffer(0);

	MENUITEMINFO _Split_0 = {};
	_Split_0.cbSize = sizeof(MENUITEMINFO);
	_Split_0.fMask =  MIIM_TYPE;
	_Split_0.fType = MFT_SEPARATOR;
	_Split_0.wID = idCmdFirst+2;
	_Split_0.dwTypeData = L"-";



	// Final Menu Structure Tools Menu
	MENUITEMINFO subMenu_05 = {};
	subMenu_05.cbSize = sizeof(MENUITEMINFO);
	subMenu_05.fMask = MIIM_BITMAP | MIIM_SUBMENU | MIIM_STRING | MIIM_ID;
	subMenu_05.hbmpItem = GETICON("Services_16px");
	subMenu_05.hSubMenu = settingMenu_1;
	subMenu_05.wID = idCmdFirst+7;
	subMenu_05.dwTypeData = L"Tools";
	
	MENUITEMINFO subMenu_Q = {};
	subMenu_Q.cbSize = sizeof(MENUITEMINFO);
	subMenu_Q.fMask = MIIM_BITMAP | MIIM_STRING | MIIM_ID;
	subMenu_Q.hbmpItem = GETICON("Quick_16px");
	subMenu_Q.wID = idCmdFirst+8;
	subMenu_Q.dwTypeData = L"Quick Help";
	
	MENUITEMINFO subMenu_R = {};
	subMenu_R.cbSize = sizeof(MENUITEMINFO);
	subMenu_R.fMask = MIIM_BITMAP | MIIM_STRING | MIIM_ID;
	subMenu_R.hbmpItem = GETICON("Delete_16px");
	subMenu_R.wID = idCmdFirst+9;
	subMenu_R.dwTypeData = L"Remove File Attribute";
	
	MENUITEMINFO _Split_1 = {};
	_Split_1.cbSize = sizeof(MENUITEMINFO);
	_Split_1.fMask =  MIIM_TYPE;
	_Split_1.fType = MFT_SEPARATOR;
	_Split_1.wID = idCmdFirst+10;
	_Split_1.dwTypeData = L"-";

	if (_PackName_1 != "")
	{
		InsertMenuItem(subMenus, idCmdFirst + 1, TRUE, &subMenu_01);
	}
	if (_PackName_2 != "")
	{
		InsertMenuItem(subMenus, idCmdFirst + 2, TRUE, &subMenu_02);
	}
	if (_PackName_3 != "")
	{
		InsertMenuItem(subMenus, idCmdFirst + 3, TRUE, &subMenu_03);
	}
	if (_PackName_4 != "")
	{
		InsertMenuItem(subMenus, idCmdFirst + 4, TRUE, &subMenu_04);
	}
	
	InsertMenuItem(subMenus, idCmdFirst + 5, TRUE, &_Split_0);
	InsertMenuItem(subMenus, idCmdFirst + 6, TRUE, &subMenu_05);
	InsertMenuItem(subMenus, idCmdFirst + 9, TRUE, &subMenu_Q);
	InsertMenuItem(subMenus, idCmdFirst + 10, TRUE, &subMenu_R);
	InsertMenuItem(subMenus, idCmdFirst + 11, TRUE, &_Split_1);

	ifstream reader_0(_Path_0);

	// Get The Value
	string _PackName_____((std::istreambuf_iterator<char>(reader_0)),
			(std::istreambuf_iterator<char>()) );

	if (_PackName_____ != "")
	{
		// Custom Pack One
		_PackName_0 = _PackName_____;

		sqlite3_stmt *statement;

		string _q = "select ID,clmShell,clmTitle from vShellIcons where clmName Like '" + _PackName_____ + "' and clmInShell=1";
		char *cstr = new char[_q.length() + 1];
		strcpy_s(cstr,_q.length() + 1 ,_q.c_str());

		//CString _Mess = _q.c_str();
		//MessageBox(NULL, _Mess.GetBuffer(0), L"Error", MB_OK);

		char *query = cstr;
		if ( sqlite3_prepare(dbfile, query, -1, &statement, 0 ) == SQLITE_OK ) 
		{
			
			int res = 0;

			while ( 1 ) 		
			{
				res = sqlite3_step(statement);
				if ( res == SQLITE_ROW ) 
				{
					string _sName = (char*)sqlite3_column_text(statement, 2);
					MENUITEMINFO subMenu_1_1 = {};
					subMenu_1_1.cbSize = sizeof(MENUITEMINFO);
					subMenu_1_1.wID = idCmdFirst + sqlite3_column_int(statement, 0) + 50;
					CString _NameIcon = _sName.c_str();
					subMenu_1_1.dwTypeData =  _NameIcon.GetBuffer(0);
					subMenu_1_1.fMask = MIIM_STRING | MIIM_STATE | MIIM_BITMAP | MIIM_FTYPE | MIIM_ID;

					if (_bigID < idCmdFirst + sqlite3_column_int(statement, 0) + 50)
					{
						_bigID = idCmdFirst + sqlite3_column_int(statement, 0) + 50;
					}

					string _Path = (char*)sqlite3_column_text(statement, 1);
					string _iName = "C:\\ProgramData\\2.2.0.0\\shell\\" + _Path + ".bmp";
					CString _iNameIcon = _iName.c_str();
					LPWSTR _IconPath = _iNameIcon.GetBuffer(0);
					HBITMAP iconHandle = (HBITMAP)LoadImageW(NULL, _IconPath, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADTRANSPARENT | LR_LOADFROMFILE); MENUITEMINFOW contextEntryAppSuite = { sizeof(contextEntryAppSuite) };
					//iconHandle = TransparentCopy(iconHandle, RGB(255, 255, 255));
					subMenu_1_1.fType = MFT_STRING;
					subMenu_1_1.fState=MFS_ENABLED;
					subMenu_1_1.hbmpItem=MakeBitMapTransparent(iconHandle);
					MENUINFO menuInfo;
					menuInfo.cbSize=sizeof(MENUINFO);
					menuInfo.fMask=MIM_STYLE;
					menuInfo.dwStyle=MNS_CHECKORBMP;
					SetMenuInfo(customPack_01, &menuInfo);
					
					InsertMenuItem(subMenus, idCmdFirst + sqlite3_column_int(statement,0) + 50, TRUE, &subMenu_1_1);

				}

				if ( res == SQLITE_DONE )	
				{
					break;
				}					
			}
		}
		else
		{
			MessageBox(NULL, L"Error", L"Error", MB_OK);
		}

	}


	MENUITEMINFO MainMenu = {};
	MainMenu.cbSize = sizeof(MENUITEMINFO);
	MainMenu.fMask = MIIM_SUBMENU |  MIIM_STRING | MIIM_STATE | MIIM_BITMAP | MIIM_FTYPE | MIIM_ID;
	MainMenu.hSubMenu = settingMenu_1;
	MainMenu.wID = indexMenu;
	MainMenu.dwTypeData = L"My Advanced Menu";
	MainMenu.hbmpItem = GETICON("Icon");
	MainMenu.hSubMenu = subMenus;
	InsertMenuItem(hmenu, 0, TRUE, &MainMenu);

	/*InsertMenu (hmenu, indexMenu, MIIM_BITMAP | MF_BYPOSITION | MF_POPUP, 
                 (UINT_PTR) subMenus, L"My Advanced Menu");*/

	sqlite3_close(dbfile);
	return MAKE_HRESULT(SEVERITY_SUCCESS, 0, _bigID - idCmdFirst + 1);
}

Dave Kreskowiak

Нужно больше деталей. Это 60 пунктов, которые вы намеревались там разместить, или ваш код постоянно добавляет одни и те же пункты снова и снова в меню?

В вашем коде определенно есть ошибки, но, поскольку мы абсолютно ничего не знаем о вашем коде, невозможно сказать вам, что вы делаете неправильно.

CPallini

Как мы можем помочь вам, не взглянув на код? Ну, мы могли бы сказать, что ваш код глючит.

2 Ответов

Рейтинг:
2

Ali Hojjati

Вот мой код

#include "MyAdvancedMenuContextMenuHandler.h"
#include <iostream>
#include <fstream>
#include <atlstr.h>
#include <stdio.h>
#include "sqlite3.h"
#include <tchar.h>
#include <Windows.h>
#include <ShlObj.h>
#include <strsafe.h>
#include <direct.h>

using namespace std;

#define DB "C:\\ProgramData\\DataBase.db"
sqlite3 *dbfile;
bool isOpenDB = false;
UINT FirstID = 0;

#define IDM_DISPLAY             0  // The command's identifier offset

HDC hdcSrc, hdcDst;
HBITMAP hbmOld;
HBITMAP	hbmNew;
BITMAP bm;
COLORREF clrTP, clrBK;

MyAdvancedMenuContexthandler::~MyAdvancedMenuContexthandler()
{
	InterlockedDecrement(&g_cObjCount);
}

MyAdvancedMenuContexthandler::MyAdvancedMenuContexthandler() : m_ObjRefCount(1)
{
	InterlockedIncrement(&g_cObjCount);
}

ULONG MyAdvancedMenuContexthandler::AddRef()
{
	return InterlockedIncrement(&m_ObjRefCount);
}

ULONG MyAdvancedMenuContexthandler::Release()
{
	ULONG returnValue = InterlockedDecrement(&m_ObjRefCount);
	if (returnValue < 1)
	{
		delete this;
	}
	return returnValue;
}

HRESULT MyAdvancedMenuContexthandler::QueryInterface(REFIID riid, void **ppvObject)
{
	if (!ppvObject)
		return E_POINTER;
	*ppvObject = NULL;

	if (IsEqualIID(riid, IID_IUnknown))
	{
		*ppvObject = this;
		this->AddRef();
		return S_OK;
	}
	else if (IsEqualIID(riid, IID_IContextMenu))
	{
		*ppvObject = (IContextMenu*) this;
		this->AddRef();
		return S_OK;
	}
	else if (IsEqualIID(riid, IID_IShellExtInit))
	{
		*ppvObject = (IShellExtInit*) this;
		this->AddRef();
		return S_OK;
	}
	else
	{
		return E_NOINTERFACE;
	}
	return E_NOTIMPL;
}

HRESULT MyAdvancedMenuContexthandler::Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pDataObj, HKEY hkeyProgID)
{
	if (NULL == pDataObj)
    {
        return E_INVALIDARG;
    }

    HRESULT hr = E_FAIL;

    FORMATETC fe = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
    STGMEDIUM stm;

    // The pDataObj pointer contains the objects being acted upon. In this 
    // example, we get an HDROP handle for enumerating the selected files and 
    // folders.
    if (SUCCEEDED(pDataObj->GetData(&fe, &stm)))
    {
        // Get an HDROP handle.
        HDROP hDrop = static_cast<HDROP>(GlobalLock(stm.hGlobal));
        if (hDrop != NULL)
        {
            // Determine how many files are involved in this operation. This 
            // code sample displays the custom context menu item when only 
            // one file is selected. 
            UINT nFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
            if (nFiles == 1)
            {

                // Get the path of the file.
                if (0 != DragQueryFile(hDrop, 0, m_szSelectedFile, 
                    ARRAYSIZE(m_szSelectedFile)))
                {
					wchar_t szMessage[300];
					if (SUCCEEDED(StringCchPrintf(szMessage, ARRAYSIZE(szMessage), 
						L"The selected file is:\r\n\r\n%s", this->m_szSelectedFile)))
						{
							//MessageBox(NULL, szMessage, L"CppShellExtContextMenuHandler", MB_OK);
						}
                    hr = S_OK;
                }
            }

            GlobalUnlock(stm.hGlobal);
        }

        ReleaseStgMedium(&stm);
    } 

    // If any value other than S_OK is returned from the method, the context 
    // menu item is not displayed.
    return S_OK;
}

HRESULT MyAdvancedMenuContexthandler::GetCommandString(UINT_PTR idCmd, UINT uFlags, UINT * pwReserved, LPSTR pszName, UINT cchMax)
{
	return E_NOTIMPL;
}

HRESULT MyAdvancedMenuContexthandler::InvokeCommand(LPCMINVOKECOMMANDINFO pici)
{
	/*wchar_t szMessage[300];
	StringCchPrintf(szMessage, ARRAYSIZE(szMessage), L"The selected file is:\r\n\r\n%s", this->m_szSelectedFile);*/
	//MessageBox(NULL, m_szSelectedFile, L"CppShellExtContextMenuHandler", MB_OK);
	//system("notepad.exe");
	PCSTR m_pszVerb;
	//	StrCmpIA(pici->lpVerb, m_pszVerb);

	LPWSTR wszPath = NULL;
	HRESULT hr_FilePath;

	hr_FilePath = SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, NULL, &wszPath);

	wstring _PackName_10(L"\\2.2.0.0\\command.cmd");
	wstring _Path_0(wszPath);
	_Path_0 = _Path_0 + _PackName_10;

	wofstream _writer(_Path_0);
	if (_writer.is_open())
	{
		if ((UINT)pici->lpVerb < 50)
		{
			//MessageBox(NULL, (LPCWSTR)pici->lpVerb, L"Code", MB_OK);
			//MessageBox(NULL, (LPCWSTR)m_szSelectedFile, L"Code", MB_OK);

			UINT _Code = (UINT)pici->lpVerb;
			if (_Code == 1) //Icon Library
			{
				_writer << m_szSelectedFile;
				_writer << "|";
				_writer << 3;
				_writer << "|0" << endl;
			}
			else if (_Code == 2) //Icon File Library
			{
				_writer << m_szSelectedFile;
				_writer << "|";
				_writer << 4;
				_writer << "|0" << endl;
			}
			else if (_Code == 3) //Icon File Library
			{
				_writer << m_szSelectedFile;
				_writer << "|";
				_writer << 7;
				_writer << "|0" << endl;
			}
			else if (_Code == 4) //Icon File Library
			{
				_writer << m_szSelectedFile;
				_writer << "|";
				_writer << 5;
				_writer << "|0" << endl;
			}
			else if (_Code == 5) //Icon File Library
			{
				_writer << m_szSelectedFile;
				_writer << "|";
				_writer << 6;
				_writer << "|0" << endl;
			}
			else if (_Code == 7) //Icon File Library
			{
				_writer << m_szSelectedFile;
				_writer << "|";
				_writer << 9;
				_writer << "|0" << endl;
			}
			else if (_Code == 8) //Icon File Library
			{
				_writer << m_szSelectedFile;
				_writer << "|";
				_writer << 8;
				_writer << "|0" << endl;
			}
			else if (_Code == 9) //Icon File Library
			{
				_writer << m_szSelectedFile;
				_writer << "|";
				_writer << 0;
				_writer << "|0" << endl;
			}
		}
		else
		{
		_writer << m_szSelectedFile;
		_writer << "|" << 1;
		_writer << "|";
		_writer << (UINT)pici->lpVerb - 50 << endl;
		}
	}
	_writer.close();
	//LPWSTR wszPath_ = NULL;
	////SHGetKnownFolderPath(FOLDERID_, 0, NULL, &wszPath_);


	//char the_patha[256];
	//_getcwd(the_patha, 255);

	//size_t nSize1 = 1 + strlen(the_patha);

 //   LPWSTR wUserName = new WCHAR[nSize1];

 //   MultiByteToWideChar(CP_ACP, 0, the_patha, -1, wUserName, nSize1);

	///*LPWSTR _Base = NULL;
	//MultiByteToWideChar(CP_ACP, 0, the_patha, -1, _Base, 0);*/

	//MessageBox(NULL, wUserName, L"Test", MB_OK);
	//wstring _Path_44(wUserName);
	//_Path_44 = _Path_44 + L"\\Change\\ChangeIcon.exe";
	//ShellExecute( NULL, NULL, (LPWSTR)_Path_44.c_str(), NULL, NULL, SW_SHOW );
	
	/*std::wstring prefix (L"");
	wstring _Fol(m_szSelectedFile);
	if(_Fol.substr(0, prefix.size()) != prefix) {
		
	}*/

	wstring _PackName_11(L"\\2.2.0.0\\change.pck");
	wstring _Path_10(wszPath);
	_Path_10 = _Path_10 + _PackName_11;
	ifstream reader_1(_Path_10);
	// Get The Value
	wstring _PackName((std::istreambuf_iterator<char>(reader_1)),
			(std::istreambuf_iterator<char>()) );

	//MessageBox(NULL, (LPWSTR)_PackName.c_str(), L"", MB_OK);

	ShellExecute( NULL, NULL, (LPWSTR)_PackName.c_str(), NULL, NULL, SW_SHOW );
	//return S_OK;
	
	return E_NOTIMPL;
}

HBITMAP MakeBitMapTransparent(HBITMAP hbmSrc)
{
	if ((hdcSrc = CreateCompatibleDC(NULL)) != NULL) {
		if ((hdcDst = CreateCompatibleDC(NULL)) != NULL) {
			int nRow, nCol;
			GetObject(hbmSrc, sizeof(bm), &bm);
			hbmOld = (HBITMAP)SelectObject(hdcSrc, hbmSrc);
			hbmNew = CreateBitmap(bm.bmWidth, bm.bmHeight, bm.bmPlanes, bm.bmBitsPixel, NULL);
			SelectObject(hdcDst, hbmNew);
			
			BitBlt(hdcDst,0,0,bm.bmWidth, bm.bmHeight,hdcSrc,0,0,SRCCOPY);

			clrTP = GetPixel(hdcDst, 0, 15);// Get color of first pixel at 0,0
			clrBK = GetSysColor(COLOR_MENU);// Get the current background color of the menu
			
			for (nRow = 0; nRow < bm.bmHeight; nRow++)// work our way through all the pixels changing their color
				for (nCol = 0; nCol < bm.bmWidth; nCol++)// when we hit our set transparency color.
					if (GetPixel(hdcDst, nCol, nRow) == clrTP)
						SetPixel(hdcDst, nCol, nRow, clrBK);
			
			DeleteDC(hdcDst);
		}
		DeleteDC(hdcSrc);
		
	}
	return hbmNew;// return our transformed bitmap.
}

HBITMAP GETICON(string _name)
{
	string _iName = "C:\\ProgramData\\2.2.0.0\\icons\\" + _name + ".bmp";
	CString _iNameIcon = _iName.c_str();
	LPWSTR _IconPath = _iNameIcon.GetBuffer(0);
	HBITMAP iconHandle = (HBITMAP)LoadImageW(NULL, _IconPath, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADTRANSPARENT | LR_LOADFROMFILE); MENUITEMINFOW contextEntryAppSuite = { sizeof(contextEntryAppSuite) };
	return MakeBitMapTransparent(iconHandle);
}

HBITMAP GETICONTrans(string _name)
{
	string _iName = "C:\\ProgramData\\2.2.0.0\\shell\\" + _name + ".bmp";
	CString _iNameIcon = _iName.c_str();
	LPWSTR _IconPath = _iNameIcon.GetBuffer(0);
	HBITMAP iconHandle = (HBITMAP)LoadImageW(NULL, _IconPath, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADTRANSPARENT | LR_LOADFROMFILE); MENUITEMINFOW contextEntryAppSuite = { sizeof(contextEntryAppSuite) };
	return MakeBitMapTransparent(iconHandle);
}

HRESULT MyAdvancedMenuContexthandler::QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
{
	if (uFlags & CMF_DEFAULTONLY)
		return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 0);

	HMENU subMenus = CreatePopupMenu();
	
	HMENU customPack_01 = CreatePopupMenu();
	HMENU customPack_02 = CreatePopupMenu();
	HMENU customPack_03 = CreatePopupMenu();
	HMENU customPack_04 = CreatePopupMenu();
	HMENU settingMenu_1 = CreatePopupMenu();
	
	FirstID = idCmdFirst;

	// Read Selected Packs for the Menu
	
	//sqlite3_open(DB, &dbfile);

	if ( sqlite3_open(DB, &dbfile) == SQLITE_OK )
	{
		//MessageBox(NULL, L"Connected Successfully", L"Connection", MB_OK);
	}


	UINT _bigID = 0;

	LPWSTR wszPath = NULL;
	HRESULT hr_FilePath;

	hr_FilePath = SHGetKnow


Richard Deeming

Если вы хотите обновить свой вопрос, Нажмите зеленую ссылку "улучшить вопрос" и отредактируйте свой вопрос.

НЕ опубликуйте свое обновление как "решение".

Рейтинг:
0

Jochen Arndt

Черное меню - это индикатор неисправного расширения.

Поскольку вы не показали нам никакого кода, я могу только дать совет проверить ваш код.

Например, вы можете закомментировать большую часть кода, показывая только диалоговое окно при активации команды меню. Затем проверьте, если проблема все еще возникает. Если нет, повторно активируйте блоки кода, пока проблема не возникнет снова. Тогда вы будете знать, какой блок кода является источником проблемы.

Вы также всегда должны проверять успешность вызовов функций (обычно проверяя возвращаемое значение). Не делать этого и продолжать - общий источник таких проблем.

[Правка: после публикации кода]

Цитата:
Привет, я проверил свои коды, и это происходит, когда я добавляю растровые изображения в пункты меню. Как предотвратить эту проблему

Вероятно, у вас закончились ресурсы GDI (что также указывает на то, что это происходит не сразу).

В вашем GETICON() функция, которую вы вызываете MakeBitMapTransparent(iconHandle) который возвращает новое (преобразованное) растровое изображение, но вы никогда не удаляете загруженное растровое изображение. Видеть
Когда вы закончите использовать загруженное растровое изображение, курсор или значок без указания флага LR_SHARED, вы можете освободить связанную с ним память, вызвав одну из функций в следующей таблице.

Поэтому вы должны вставить это в конце MakeBitMapTransparent():
DeleteObject(hbmSrc);
[/РЕДАКТИРОВАТЬ]


Ali Hojjati

Привет, я проверил свои коды, и это происходит, когда я добавляю растровые изображения в пункты меню. Как предотвратить эту проблему

Jochen Arndt

Смотрите мой обновленный ответ.

Кроме того, пожалуйста, используйте зеленую ссылку "улучшить вопрос", чтобы отредактировать свой вопрос, а не публиковать решения или большие комментарии. Я добавил код к вашему вопросу. Таким образом, вы можете удалить свое решение и комментарий.