Page 1 of 1

открытие файла(перетаскивание я

Posted: Tue Jan 20, 2009 8:52 pm
by Ranger
Собственно, как реализовать открытие файла посредством перетаскивания его ярлыка на ярлык моей программы?
Куда копать? :)

Posted: Tue Jan 20, 2009 9:32 pm
by ONEEYEMAN
Privet,
DnD (drag-and-drop) sample.

Spasibo.

Posted: Wed Jan 21, 2009 1:33 am
by T-Rex
Если на ярлык, то drag-n-drop тут не при чем.
Надо будет обрабатывать аргументы командной строки.
Смотреть в сторону переменных argc/argv в классе приложения и еще в сторону класса wxCmdLineParser

Posted: Wed Jan 21, 2009 4:21 pm
by Ranger
хорошо, допустим так:

Code: Select all

if( wxStrlen(wxGetApp().argv[1]) )
{
	wxFileName file(wxGetApp().argv[1]);
	if(file.FileExists())text_control->LoadFile(wxGetApp().argv[1]);
}
можно рабоать с файлами, а как быть именно с ярлыками этих файлов(в windows это *.lnk)? Как их обрабатывать?

Posted: Wed Jan 21, 2009 5:12 pm
by ONEEYEMAN
Ranger,
Esli ty zapuskaesh etot kod, ty poluchaesh oshibku, ili kod prosto ne rabotaet?
Esli oshibku to kakuju?

Spasibo.

Posted: Wed Jan 21, 2009 6:05 pm
by T-Rex
Понятие ярлыков Windows-specific, поэтому юзай винапи.

Posted: Wed Jan 21, 2009 7:54 pm
by ONEEYEMAN
T-Rex,
Pochemu, v GNOME'e mogno sozdat link na desktope...

Spasibo.

Posted: Wed Jan 21, 2009 8:54 pm
by Ranger
ну, в KDE тоже можно создать линк, но там нет таких проблем, как в windows, и приведённый мной участок кода в KDE вполне работает... похоже под win придётся делать как написано здесь

Posted: Wed Jan 21, 2009 9:41 pm
by T-Rex
Linux-ссылка это еще одна точка доступа к файлу, а Windows-ярлык - это файл, содержащий путь к другому файлу. Не путайте синее с мягким

Posted: Wed Jan 21, 2009 10:04 pm
by ONEEYEMAN
T-Rex,
No ved gde-to eta ssylka hranitsja? Znachit ona est fajl...
Ved v *nix'e est ponyatie "link", kotoryj mogno uvidet pri "ls -la", kak "l---------".

Spasibo.

Posted: Wed Jan 21, 2009 11:16 pm
by T-Rex
И тем не менее в никсах если указываешь путь к линку, то получаешь содержимое файла, а в виндах если указывашь путь к ярлыку то получаешь сколько-то байт сигнатуры ярлыка и путь к файлу, на который он ссылается.
Я думаю лучше просто почитать книжку и ощутить разницу.

Posted: Thu Jan 22, 2009 3:45 pm
by Ranger
вобщем, получилось так:

Code: Select all

#ifdef __WXMSW__
    #include <objidl.h>   
    #include <shlobj.h>
#endif
//...

#ifdef __WXMSW__
	if(wxStrlen(wxGetApp().argv[1]))
	{

	   IPersistFile* ppf;
	   IShellLink* pshl;
	   WIN32_FIND_DATA wfd;

	   setlocale(LC_ALL, "");	
	   ::CoInitialize(NULL);
	   ::CoCreateInstance(CLSID_ShellLink, NULL, 
                              CLSCTX_INPROC_SERVER, IID_IPersistFile, 
                              reinterpret_cast<void**>(&ppf));
	#if defined(_UNICODE)
	   ppf->Load(wxGetApp().argv[1], STGM_READ);
	#else
	   LPWSTR pwszTemp = new WCHAR[_MAX_PATH];
	   mbstowcs(pwszTemp, wxGetApp().argv[1], _MAX_PATH);
	   ppf->Load(pwszTemp, STGM_READ);
	   delete[] pwszTemp;
	#endif

	   ppf->QueryInterface(IID_IShellLink, reinterpret_cast<void**>(&pshl));
	   pshl->Resolve(NULL, SLR_ANY_MATCH | SLR_NO_UI);

	   LPTSTR pszTarget = new TCHAR[_MAX_PATH];
	   pshl->GetPath(pszTarget, _MAX_PATH, &wfd, 0);
	   
	   if( wxStrlen(pszTarget) )
	   {
		    wxFileName file(pszTarget);
			if(file.FileExists(pszTarget)) 
				text_control->LoadFile(pszTarget); 
	   }
	   else
	   {
		    wxFileName file(wxGetApp().argv[1]);
			if(file.FileExists(wxGetApp().argv[1])) 
				text_control->LoadFile(wxGetApp().argv[1]);	
	   }

	   delete[] pszTarget;
	   pshl->Release();
	   ppf->Release();

	   ::CoFreeUnusedLibraries();
	   ::CoUninitialize();
	}
#else
	if( wxStrlen(wxGetApp().argv[1]) )
	{
		wxFileName file(wxGetApp().argv[1]);
		if(file.FileExists()) text_control->LoadFile(wxGetApp().argv[1]);
	}
#endif

Posted: Thu Jan 22, 2009 5:58 pm
by T-Rex
Красивенько :)
Я думаю можно было бы вот это

Code: Select all

LPWSTR pwszTemp = new WCHAR[_MAX_PATH];
mbstowcs(pwszTemp, wxGetApp().argv[1], _MAX_PATH);
ppf->Load(pwszTemp, STGM_READ);
delete[] pwszTemp; 
просто использовать argv, это ж wxChar * , который в зависимости от использования или неиспользования юникода дефайнится на wchar_t * либо на char *.
Хотя надо бы проверить. И _UNICODE наверное все же лучше на wxUSE_UNICODE поменять, но ИМХО в данном случае это дело предпочтения.