Programlara açılış parametreleri ekleme

Başlatan JKramer, 13 Eylül 2012, 14:04:34

JKramer

Merhaba,

Normalde parametre eklemek için, ilgili programın bir kısayolunu oluşturup, kısayolun "Özellikler-->Kısayol-->Hedef" altındaki dosya yolunun sonuna parametre yazılır. Programı sürekli kısayol üzerinden başlattığımızda herhangi bir sorun yok ancak programın ürettiği bir dosyayı (ide'nin proje dosyaları mesela) çift tıklayarak açtığımızda parametresiz, orjinal haliyle açılıyor. İşte bu orjinal halini de değiştirmek için kayıt defterine girip "HKEY_CLASSES_ROOT\program adı (+uzantı olabilir)\shell\open\command" altında .exe'yi gösteren yola parametreleri eklemek yeterli.

a_a_sezen

explorer.exe nin yönettiği sağ klik menüsünde (context menu) de burası giriş seviyesi olarak kullaılıyor. Tüm detaylarıyla işlenmediğinde beklenen sonuç alınamayabilir. Context menü windows tarafından kullanıcı talep ettiğinde dinamik olarak oluşturuluyor. Bu dinamizm içinde dosya ilişkilendirmeleri en önemlisi.
context menüdeki duyarlı olacağı (ilişkilendirileceği) dosya uzantıları, temsil edileceği ikonu, gibi derinliklerde iş biraz daha karmaşıklaşıyor.
COM, CLSID ve GUID ile çalışmak gerekiyor.
Daha önemlisi programa gönderilen parametrelerin işlenmesi gerekiyor.

Kendime yazdığım bir text editörde bu özellikleri detaylı kullanmıştım. (C++Builder) Tamamen tamamlansaydı programı ücretsiz paylaşacaktım ama yetişemiyorum. Araya da epey zaman girdi zaten..
Bizim programcılarımızın pek girmediği alanlar. Ama türüne göre programların kullanıcısıyla dostluğu açısından önemli bir özellik.
Bu aralar hazırlığını yaptığım (fikri) ve tüm kodlarımı paylaşacağım blog da yayınlıyacağım. En azından prensipte..

Şu an ilgisini çekip araştıracak arkadaşlar için anahtar sözcükleri barındırması açısından aşağıda paylaşıyorum.
Sadece context menü değil ayrıca programa sürüklenen dosyaları da işliyor.

#include <vcl.h>
#include <Registry.hpp>
#pragma hdrstop

#include "EditMegaContext.h"

TemContextImpl::TemContextImpl()
{
	MenuBitmap = NULL;
	Dosyalar   = NULL;
	MenuBitmap = LoadBitmap(HInstance, "CONTEXTRESIM");
}
TemContextImpl::~TemContextImpl()
{
  if (Dosyalar)	  delete Dosyalar;
  if (MenuBitmap) DeleteObject(MenuBitmap);
}
HRESULT WINAPI TemContextImpl::UpdateRegistry(BOOL bRegister)
{
	if (bRegister) {
		CreateRegKey("*\\shellex", "", "");
		CreateRegKey("*\\shellex\\ContextMenuHandlers", "", "");
		CreateRegKey("*\\shellex\\ContextMenuHandlers\\EditMega", "", Comobj::GUIDToString(GetObjectCLSID()));
	}
	else {
		DeleteRegKey("*\\shellex\\ContextMenuHandlers\\EditMega");
	}
	TTypedComServerRegistrarT<TemContextImpl>
	regObj(GetObjectCLSID(), GetProgID(), GetDescription());
	return regObj.UpdateRegistry(bRegister);
}
//---------------------------------------------------------------------------
STDMETHODIMP TemContextImpl::Initialize(LPCITEMIDLIST pidlFolder,
   LPDATAOBJECT lpdobj, HKEY hkeyProgID)
{
	HDROP hDrop;
	HRESULT hResult;
	FORMATETC fmtEtc;
	STGMEDIUM medium;
	fmtEtc.cfFormat = CF_HDROP;
	fmtEtc.ptd = NULL;
	fmtEtc.dwAspect = DVASPECT_CONTENT;
	fmtEtc.lindex = -1;
	fmtEtc.tymed = TYMED_HGLOBAL;
	medium.tymed = TYMED_HGLOBAL;

	if((hResult = lpdobj->GetData(&fmtEtc, &medium)) < 0)
		return E_INVALIDARG;
	if((hDrop = (HDROP)GlobalLock(medium.hGlobal))==NULL)
		return E_INVALIDARG;

	char cFile[MAX_PATH];
	Dosyalar = new TStringList();
	if(DragQueryFile(hDrop, 0, cFile, sizeof(cFile)) == 0)
		hResult = E_INVALIDARG;
	else {
		int iDosya = DragQueryFile(hDrop, -1, NULL, NULL);
		for(int i = 0; i < iDosya; i++) {
			DragQueryFile(hDrop, i, cFile, sizeof(cFile));
			Dosyalar->Append(cFile);
		}
		hResult = S_OK;
	}

	GlobalUnlock(medium.hGlobal);
	ReleaseStgMedium(&medium);
	SysFreeMem(cFile);
	return hResult;
};
//---------------------------------------------------------------------------
STDMETHODIMP TemContextImpl::GetCommandString(UINT idCmd, UINT uFlags, UINT *pwReserved,
   LPSTR pszName, UINT cchMax )
{
	return S_OK;
};
//---------------------------------------------------------------------------
STDMETHODIMP TemContextImpl::QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idFirstCmd,
   UINT idLastCmd, UINT uFlags)
{
	UINT cmd = idFirstCmd;
	if (uFlags & CMF_DEFAULTONLY) 
		return MAKE_HRESULT(SEVERITY_SUCCESS,FACILITY_NULL,0);
	InsertMenu 		  (hMenu, indexMenu, MF_STRING|MF_BYPOSITION, cmd++, "EditMega");
	SetMenuItemBitmaps(hMenu, indexMenu, MF_OWNERDRAW|MF_BITMAP|MF_BYPOSITION, MenuBitmap, MenuBitmap);
	return MAKE_HRESULT(SEVERITY_SUCCESS,FACILITY_NULL, 1);
};
//---------------------------------------------------------------------------
STDMETHODIMP TemContextImpl::InvokeCommand(LPCMINVOKECOMMANDINFO pCmdInfo)
{
	HRESULT hResult;
	WORD cmdId;
	if(HIWORD(pCmdInfo->lpVerb)==0) cmdId = LOWORD(pCmdInfo->lpVerb);
	if(cmdId > 1) return E_INVALIDARG;
	switch(cmdId) {
		case	0	:
		case	1	:	OpenFiles();
						hResult = S_OK;
						break;
		default		:	hResult = E_INVALIDARG;
						break;
	}
	return hResult;
}
//---------------------------------------------------------------------------
void TemContextImpl::OpenFiles()
{
	if(Dosyalar->Count) {
		TRegistry *ARegistry = new TRegistry;
		String Anahtar = "Software\\Asoza\\EditMega\\OpenFile";
		ARegistry->RootKey = HKEY_LOCAL_MACHINE;
		try {
			if(ARegistry->OpenKey(Anahtar, true)) {
				for(int i = 0; Dosyalar->Count; i++) {
					ARegistry->WriteString(String(i+1), Dosyalar->Strings[0].Trim());
					Dosyalar->Delete(0);
				}
				ARegistry->CloseKey();
			}
			delete ARegistry;
		}
		catch(Exception &Hata) {
			delete ARegistry;
		}
	}
	TRegistry *ARegistry = new TRegistry;
	String Anahtar = "Software\\Asoza\\EditMega", asPath = "";
	ARegistry->RootKey = HKEY_LOCAL_MACHINE;
	try {
		if(ARegistry->OpenKey(Anahtar, false)) {
			asPath = ARegistry->ReadString("EditMegaPath");
			ARegistry->CloseKey();
		}
		delete ARegistry;
		ShellExecute(NULL, "open", asPath.c_str() ,NULL, NULL, SW_SHOW);
	}
	catch(Exception &Hata) {
		delete ARegistry;
	}
}
//---------------------------------------------------------------------------
Güce ve Geleceğe Güvenle...