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

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
Ranger
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sun Jun 29, 2008 1:19 pm

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

Post by Ranger »

Собственно, как реализовать открытие файла посредством перетаскивания его ярлыка на ярлык моей программы?
Куда копать? :)
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7458
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Post by ONEEYEMAN »

Privet,
DnD (drag-and-drop) sample.

Spasibo.
User avatar
T-Rex
Moderator
Moderator
Posts: 1248
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex »

Если на ярлык, то drag-n-drop тут не при чем.
Надо будет обрабатывать аргументы командной строки.
Смотреть в сторону переменных argc/argv в классе приложения и еще в сторону класса wxCmdLineParser
Ranger
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sun Jun 29, 2008 1:19 pm

Post 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)? Как их обрабатывать?
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7458
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Post by ONEEYEMAN »

Ranger,
Esli ty zapuskaesh etot kod, ty poluchaesh oshibku, ili kod prosto ne rabotaet?
Esli oshibku to kakuju?

Spasibo.
User avatar
T-Rex
Moderator
Moderator
Posts: 1248
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex »

Понятие ярлыков Windows-specific, поэтому юзай винапи.
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7458
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Post by ONEEYEMAN »

T-Rex,
Pochemu, v GNOME'e mogno sozdat link na desktope...

Spasibo.
Ranger
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sun Jun 29, 2008 1:19 pm

Post by Ranger »

ну, в KDE тоже можно создать линк, но там нет таких проблем, как в windows, и приведённый мной участок кода в KDE вполне работает... похоже под win придётся делать как написано здесь
User avatar
T-Rex
Moderator
Moderator
Posts: 1248
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex »

Linux-ссылка это еще одна точка доступа к файлу, а Windows-ярлык - это файл, содержащий путь к другому файлу. Не путайте синее с мягким
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7458
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Post 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.
User avatar
T-Rex
Moderator
Moderator
Posts: 1248
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex »

И тем не менее в никсах если указываешь путь к линку, то получаешь содержимое файла, а в виндах если указывашь путь к ярлыку то получаешь сколько-то байт сигнатуры ярлыка и путь к файлу, на который он ссылается.
Я думаю лучше просто почитать книжку и ощутить разницу.
Ranger
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sun Jun 29, 2008 1:19 pm

Post 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
User avatar
T-Rex
Moderator
Moderator
Posts: 1248
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post 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 поменять, но ИМХО в данном случае это дело предпочтения.
Post Reply