открытие файла(перетаскивание я 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 » Tue Jan 20, 2009 8:52 pm

Собственно, как реализовать открытие файла посредством перетаскивания его ярлыка на ярлык моей программы?
Куда копать? :)

ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 4371
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Post by ONEEYEMAN » Tue Jan 20, 2009 9:32 pm

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

Spasibo.

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

Post by T-Rex » Wed Jan 21, 2009 1:33 am

Если на ярлык, то 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 » Wed Jan 21, 2009 4:21 pm

хорошо, допустим так:

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: 4371
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Post by ONEEYEMAN » Wed Jan 21, 2009 5:12 pm

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: 1198
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex » Wed Jan 21, 2009 6:05 pm

Понятие ярлыков Windows-specific, поэтому юзай винапи.

ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 4371
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Post by ONEEYEMAN » Wed Jan 21, 2009 7:54 pm

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 » Wed Jan 21, 2009 8:54 pm

ну, в KDE тоже можно создать линк, но там нет таких проблем, как в windows, и приведённый мной участок кода в KDE вполне работает... похоже под win придётся делать как написано здесь

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

Post by T-Rex » Wed Jan 21, 2009 9:41 pm

Linux-ссылка это еще одна точка доступа к файлу, а Windows-ярлык - это файл, содержащий путь к другому файлу. Не путайте синее с мягким

ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 4371
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Post by ONEEYEMAN » Wed Jan 21, 2009 10:04 pm

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: 1198
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex » Wed Jan 21, 2009 11:16 pm

И тем не менее в никсах если указываешь путь к линку, то получаешь содержимое файла, а в виндах если указывашь путь к ярлыку то получаешь сколько-то байт сигнатуры ярлыка и путь к файлу, на который он ссылается.
Я думаю лучше просто почитать книжку и ощутить разницу.

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

Post by Ranger » Thu Jan 22, 2009 3:45 pm

вобщем, получилось так:

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: 1198
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex » Thu Jan 22, 2009 5:58 pm

Красивенько :)
Я думаю можно было бы вот это

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