Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
-
Ranger
- 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

- Posts: 5013
- 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.
-
T-Rex
- Moderator

- Posts: 1204
- 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

- 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

- Posts: 5013
- 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.
-
T-Rex
- Moderator

- Posts: 1204
- 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

- Posts: 5013
- 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

- Posts: 30
- Joined: Sun Jun 29, 2008 1:19 pm
Post
by Ranger » Wed Jan 21, 2009 8:54 pm
ну, в KDE тоже можно создать линк, но там нет таких проблем, как в windows, и приведённый мной участок кода в KDE вполне работает... похоже под win придётся делать как написано
здесь
-
T-Rex
- Moderator

- Posts: 1204
- 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

- Posts: 5013
- 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.
-
T-Rex
- Moderator

- Posts: 1204
- 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

- 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
-
T-Rex
- Moderator

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