grBIN |
Отправлено: 09 Марта, 2018 - 00:03:08
|
Наблюдатель
Покинул форум
Сообщений всего: 41
Дата рег-ции: Нояб. 2017
Откуда: Псков
Репутация: 2
|
Привет, в поиске не нашел, так что напишу тут.
Нужно вызвать окно, по типу как open, или browse или сохранить как.
Грубо говоря что бы дать пользователю самому показать где находиться файл, а потом этот путь сохранить.
У нас в функциях такого нет, вроде как должна работать функция GetOpenFileName() из COMDLG32.DLL
В интернетах нашел, что нужно еще вроде как правильно заполнить структуру
Спойлер (Отобразить)Спасибо вот эта функция работает GetOpenFileName ()
Но там оказывается надо было структуру заполнять.
Вот так работает:
CODE:
OPENFILENAMEA ofn;
char filename[256]={0};
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd_; // не обязательно
ofn.lpstrFilter = "Bitmap Files (*.bmp)\0*.bmp\0All Files (*.*\0*.*\0\0";
ofn.lpstrFile = filename;
ofn.nMaxFile = 256;
ofn.lpstrTitle = "Browse";
ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
GetOpenFileNameA(&ofn);
std::cout << "\nоткрытый файл=" << filename;
И у нас на форуме нашел в теме про external
Спойлер (Отобразить)Заполнение структуры для передачи в виде параметра в GetSaveFileNameA.. Используется COMDLG32.
CODE:external(VOID, "GetSaveFile", "GetSaveFileNameA", "COMDLG32.DLL");
char b[100];
strcpy(#b[0], "Все файлы такого типа..");
char a[76];
for (int n=0; n<76; n++)a[n]=0;
writeaddress(76, address(#a[0]));
writeaddress(0, address(#a[4]));
writeaddress(0, address(#a[8]));
writeaddress(address(#b[0]), address(#a[12]));
writeaddress(0, address(#a[16]));
writeaddress(1634928, address(#a[20]));
writeaddress(1000, address(#a[24]));
writeaddress(0, address(#a[28]));
writeaddress(0, address(#a[32]));
writeaddress(0, address(#a[36]));
writeaddress(6148, address(#a[40]));
GetSaveFile(address(#a[0]));
Главная проблема правильно заполнить структуру, указатель на которую надо передать в виде параметра функции..
А теперь вопрос, что это вообще такое, и как это правильно готовить :S |
|
|
Zireael |
Отправлено: 09 Марта, 2018 - 00:51:07
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Вроде работает.
CODE:external(VOID, "GetOpenFileName", "GetOpenFileNameA", "COMDLG32.DLL");
char b[512];
b[0]=formatic(0);
char a[76];
for (int n=0; n<76; n++)a[n]=0;
writeaddress(76, address(#a[0]));
writeaddress(0, address(#a[4]));
writeaddress(0, address(#a[8]));
writeaddress(0, address(#a[12]));
writeaddress(0, address(#a[16]));
writeaddress(1634928, address(#a[20]));
writeaddress(1000, address(#a[24]));
writeaddress(address(#b[0]), address(#a[28]));
writeaddress(512, address(#a[32]));
writeaddress(0, address(#a[36]));
writeaddress(6148, address(#a[40]));
GetOpenFileName(address(#a[0]));
messagebox(format(#b[0])); |
|
|
grBIN |
Отправлено: 09 Марта, 2018 - 01:24:54
|
Наблюдатель
Покинул форум
Сообщений всего: 41
Дата рег-ции: Нояб. 2017
Откуда: Псков
Репутация: 2
|
Спойлер (Отобразить)Вроде работает.
CODE:external(VOID, "GetOpenFileName", "GetOpenFileNameA", "COMDLG32.DLL");
char b[512];
b[0]=formatic(0);
char a[76];
for (int n=0; n<76; n++)a[n]=0;
writeaddress(76, address(#a[0]));
writeaddress(0, address(#a[4]));
writeaddress(0, address(#a[8]));
writeaddress(0, address(#a[12]));
writeaddress(0, address(#a[16]));
writeaddress(1634928, address(#a[20]));
writeaddress(1000, address(#a[24]));
writeaddress(address(#b[0]), address(#a[28]));
writeaddress(512, address(#a[32]));
writeaddress(0, address(#a[36]));
writeaddress(6148, address(#a[40]));
GetOpenFileName(address(#a[0]));
messagebox(format(#b[0]));
Я правильно понял, вы просто подставили структуру из справки?
Получается она одна и та же для всех функций где требуется?
Что если мне понадобиться вызвать несколько подобных функций из winapi в которых нужно структуру так описывать? Я могу просто закинуть это таким образом?
CODE:
#external первой функции
#external второй функции
вызов функции 1;
вызов функции 2;
функция первая
{
Ее структура;
Вызов функции;
}
Функция вторая
{
Та же структура;
вызов второй функции;
}
Как то странно это -___-
P.S. Матчасти не хватает -______- |
|
|
Kibor |
Отправлено: 09 Марта, 2018 - 01:35:42
|
Эксперт
Просматривает форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
grBIN пишет: сохранить как
CODE:external(VOID, "GetSaveFile", "GetSaveFileNameA", "COMDLG32.DLL");
char b[100];
strcpy(#b[0], "файл");
char f[256];
for (int n=0; n<256; n++)f[n]=0;
char a[77];
for (n=0; n<77; n++)a[n]=0;
writeaddress(76, address(#a[0]));
writeaddress(0, address(#a[4]));
writeaddress(0, address(#a[8]));
writeaddress(address(#b[0]), address(#a[12]));
writeaddress(0, address(#a[16]));
writeaddress(1634928, address(#a[20]));
writeaddress(1000, address(#a[24]));
writeaddress(0, address(#a[28]));
writeaddress(0, address(#a[32]));
writeaddress(address(#f[0]), address(#a[36]));
writeaddress(6148, address(#a[40]));
GetSaveFile(address(#a[0]));
messagebox (format(#f[0]));
Для того что бы заполнять структуру таким образом надо знать что за чем идет (я имею ввиду в байтах) и сколько каждый элемент структуры занимает байт.
Ориентироваться надо не на пример
grBIN пишет: OPENFILENAMEA ofn;
char filename[256]={0};
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd_; // не обязательно
ofn.lpstrFilter = "Bitmap Files (*.bmp)\0*.bmp\0All Files (*.*\0*.*\0\0";
ofn.lpstrFile = filename;
ofn.nMaxFile = 256;
ofn.lpstrTitle = "Browse";
ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
GetOpenFileNameA(&ofn);
std::cout << "\nоткрытый файл=" << filename;
а на такого вида примеры
CODE:typedef struct tagOFN {
DWORD lStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
LPCTSTR lpstrFilter;
LPTSTR lpstrCustomFilter;
DWORD nMaxCustFilter;
DWORD nFilterIndex;
LPTSTR lpstrFile;
DWORD nMaxFile;
LPTSTR lpstrFileTitle;
DWORD nMaxFileTitle;
LPCTSTR lpstrInitialDir;
LPCTSTR lpstrTitle;
DWORD Flags;
WORD nFileOffset;
WORD nFileExtension;
LPCTSTR lpstrDefExt;
LPARAM lCustData;
LPOFNHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
#if (_WIN32_WINNT >= 0x0500)
void * pvReserved;
DWORD dwReserved;
DWORD FlagsEx;
#endif // (_WIN32_WINNT >= 0x0500)
} OPENFILENAME, *LPOPENFILENAME;
|
|
|
|