Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Открыть новую тему     Написать ответ в эту тему

Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Nikopoloc
Внимательно читаем в MSDN описание параметра lpstrFile:
 
lpstrFile
Pointer to a buffer that contains a file name used to initialize the File Name edit control. The first character of this buffer must be NULL if initialization is not necessary.
 
А у тебя в этом буфере - мусор. Добавь szFile[0]=0 до вызова GetOpenFileName.
Параметр hwnd - правильный?
 
PS. Не забывай про функцию CommDlgExtendedError - она помогает диагностировать ошибки при вызове таких диалогов.
 
PPS.

Цитата:
Где можно посмотреть теги форума как выделять код.

Под формой ответа - "Опции сообщения". Слово "коды" кликабельно.

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 18:03 27-11-2005
MrZeRo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, пожалуйста, как отследить момент, когда открывается лоток привода CD?
Для чего это нужно:
например, вставлен диск, проигрывается файл с него, и пользователь вынимает диск. Вида через какое-то время начинает кричать, чтобы ей вставили диск назад, а как бы перехватить ситуацию выемки диска, чтобы корректно это обработать и остановить проигрывание? (это реализовано, например, в JetAudio)
Через FindFirstChangeNotification не получается.

----------
... не это главное ...

Всего записей: 831 | Зарегистр. 30-01-2002 | Отправлено: 14:01 28-11-2005
vserd

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
доброго здравия.
Есть такая задачка.
В .rc файле есть описние двух диалогов, совпадающих на 99% во всем кроме стиля COMBOBOX-a. В одном случае это CBS_DROPDOWN, в другом CBS_DROPDOWNLIST. Хочется слить эти два дилога в один  с каким нибудь самописным флагом который будет задавать стиль. Но не понятно как можно изменять стиль уже созданного контрола.
Почитав MSDN у меня сложилось впечатление что это невозможно или я неправ?  
Не ужели прийдется держать два практически идентичных ресурса?

Код:
 
//**********************
ASK DIALOGEX 0, 0, 186, 87
STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION |  
    WS_SYSMENU
CAPTION "Wanted info !!!"
FONT 8, "MS Sans Serif", 0, 0, 0x1
BEGIN
    COMBOBOX        IDC_EDIT,11,40,163,55,CBS_DROPDOWN | WS_VSCROLL |  
                    WS_TABSTOP
    DEFPUSHBUTTON   "OK",IDOK,132,68,50,14,0,WS_EX_STATICEDGE
    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDFRAME,3,5,179,57
    LTEXT           "Enter, please, parameter # %d\nfor running command ""%s"" :",
                    IDC_STATIC_REQ,41,15,138,18
    ICON            32514,IDC_STATIC,12,13,20,20
END
//**********************
ASK_TYPE DIALOGEX 0, 0, 186, 87
STYLE DS_MODALFRAME | DS_CENTER | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION |  
    WS_SYSMENU
CAPTION "Wanted info !!!"
FONT 8, "MS Sans Serif", 0, 0, 0x1
BEGIN
    COMBOBOX        IDC_EDIT,11,40,163,55,CBS_DROPDOWNLIST | WS_VSCROLL |  
                    WS_TABSTOP
    DEFPUSHBUTTON   "OK",IDOK,132,68,50,14,0,WS_EX_STATICEDGE
    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDFRAME,3,5,179,57
    LTEXT           "Enter, please, parameter # %d\nfor running command ""%s"" :",
                    IDC_STATIC_REQ,41,15,138,18
    ICON            32514,IDC_STATIC,12,13,20,20
END
//**********************
 

 

Всего записей: 2065 | Зарегистр. 08-05-2002 | Отправлено: 17:15 28-11-2005
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vserd
А GetWindowLong/SetWindowLong с GWL_STYLE и установкой/сбросом соответствующих CBS_флагов для окна этого самого COMBOBOX-a в обработчике WM_INITDIALOG пробовал?
 
Добавлено:
MrZeRo
Копай в сторону WM_DEVICECHANGE.

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 19:52 28-11-2005
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MrZeRo
http://support.microsoft.com/kb/q163503/
вот название статьи How To Getting Notification of CD-ROM Insertion or Removal вроде то, что тебе надо.
vserd
Как вариант, контрол можно ручками создавать через CreateWindowEx


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:49 29-11-2005
MrZeRo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
ShIvADeSt
Да, это оно. Спасибо!

----------
... не это главное ...

Всего записей: 831 | Зарегистр. 30-01-2002 | Отправлено: 11:53 29-11-2005
vserd

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62

Цитата:
А GetWindowLong/SetWindowLong с GWL_STYLE и установкой/сбросом соответствующих CBS_флагов для окна этого самого COMBOBOX-a в обработчике WM_INITDIALOG пробовал

Попробую, спасибо!

Всего записей: 2065 | Зарегистр. 08-05-2002 | Отправлено: 17:31 29-11-2005
DeADMoHAX



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Код:
 
bool sendres(char fpath[128])
{
    HANDLE hFtp,hInet;
    strcat(fpath,"res.log");
    hInet=InternetOpen("MSIE6.0",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,INTERNET_FLAG_ASYNC);
    if(!hInet)
    {
        cout<<"Error with func InternetOpen !\n";
        cout<<GetLastError();
        return 0;
    }
    hFtp=InternetConnect(hInet,ftp_ip,INTERNET_DEFAULT_FTP_PORT,NULL,NULL,INTERNET_SERVICE_FTP,NULL,NULL);
    if(!hFtp)
    {
        cout<<"Error with func InternetConnect !\n";
        cout<<GetLastError();
        return 0;
    }
    if(!FtpPutFile(hFtp,"res.log","ftp/res.log",FTP_TRANSFER_TYPE_UNKNOWN,NULL))
    {
        cout<<"Error with putting file to the FTP\n";
        cout<<GetLastError();
        return 0;
    }
    
    InternetCloseHandle(hFtp);
    InternetCloseHandle(hInet);
    return 1;
}

Параметр-путь к файлу на ftp-server'e Сервак есть на локале, выдает эта функция еррор с InternetConnect вроде 12003 номер ошибки. Че за ботва, файл не передается.

----------
dmlabs.ru || hackconnect.ru
Выгодно России – значит, хорошо. Не выгодно России – пошёл на хер.

Всего записей: 1367 | Зарегистр. 03-02-2005 | Отправлено: 01:06 03-12-2005
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DeADMoHAX
Ну и заглянул бы в MSDN: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/wininet_errors.asp

Цитата:
 
ERROR_INTERNET_EXTENDED_ERROR  
12003
An extended error was returned from the server. This is typically a string or buffer containing a verbose error message. Call InternetGetLastResponseInfo to retrieve the error text.
 

Вызови упомянутую функцию, да посмотри, что за отлуп сервер даёт.

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 02:59 03-12-2005 | Исправлено: Abs62, 03:01 03-12-2005
distance

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DeADMoHAX
ну, во-первых код неправильный. чем дальше по ходу действия возникнет ошибка, тем хуже. и вообще, потенциально небезопасный. экспойт сюда так и просится. про поддержку уникода я вообще молчу.  
переписать хотя бы так:

Код:
 
bool sendres(LPTCSTR fpath, DWORD bufSize)  
{  
    HANDLE hFtp=NULL;
    hInet=NULL;
     
    // хм, а в конце строки всегда будет слэш?
    ::StringCchCat(fpath, bufSize, _T("res.log"));
 
    while(FALSE)
    {
        ...
        if (!hInet)
            break;
 
        ...
        if (!hFtp)
            break;
    }
 
    if (hFtp)
        ::InternetCloseHandle(hFtp);  
 
    if (hInet)
        ::InternetCloseHandle(hInet);  
     
    return (hInet && hFtp);
}

для FtpPutFile сервер должен поддерживать команду put. кстати, зачем ты передешь в функцию fpath, но реально эта переменная не используется?
 
в общем случае решение проблемы:
1. если вызов завершился неудачей, позвать примерно такую функцию:

Код:
 
CString CWinError::GetString()
{
    const UINT cbSize = 1024;
    TCHAR szBuf[cbSize] = { _T('\0') };
    DWORD dwCode;
 
    HRESULT hr = ::GetLastError();
    if (hr == ERROR_INTERNET_EXTENDED_ERROR)
    {        
        DWORD dwLength = cbSize;
        ::InternetGetLastResponseInfo(&dwCode, szBuf, &dwLength);
    }
    else
    {    
        ::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), szBuf, cbSize, NULL);
    }
    CString s(szBuf);
    s.Trim();
 
    return s;
}
 

2. думать над причиной ошибки
 

Всего записей: 878 | Зарегистр. 28-03-2004 | Отправлено: 03:00 03-12-2005
DeADMoHAX



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
кстати, зачем ты передешь в функцию fpath, но реально эта переменная не используется?

она в функции FtpPutFile 3-й параметр по идее, просто щас обрубил, пока не разобрался.

Цитата:
 экспойт сюда так и просится. про поддержку уникода я вообще молчу.

нафиг мне юникод. Да и эксплуатировать что-либо бессмысленно.

Цитата:
hInet=NULL;
без HANDLE - лол.
 
твой код не альтернативен. У меня не юзается MFC - только  ВинАПИ и СТЛ.

----------
dmlabs.ru || hackconnect.ru
Выгодно России – значит, хорошо. Не выгодно России – пошёл на хер.

Всего записей: 1367 | Зарегистр. 03-02-2005 | Отправлено: 10:03 03-12-2005
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
distance
А зачем тут while(FALSE){...}, и как оно должно работать? Может, имелось в виду do{...}while(FALSE)?  

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 13:45 03-12-2005
distance

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DeADMoHAX

Цитата:
нафиг мне юникод

это ты про стандарт, поддерживаемый международной организацией iso и развивающийся уже более десяти лет? мощнО ну ладно, дело хозяйское.

Цитата:
без HANDLE - лол.

это ерунда, я же прямо  браузере текст набросал. такие ошибки тебе любой компилятор за 5 сек покажет, а если среда умная, то и без компиляции даже. программные ошибки, сам понимаешь, гораздо больше проблем могут доставить.

Цитата:
твой код не альтернативен

читал. много думал (c)
код не альтернативен чему?

Цитата:
У меня не юзается MFC

а mfc здесь и не главное. лень было код писать, если можно сделать copy-paste из проекта. смысл здесь не в CString, а в том, что ты получаешь вменяемую информацию об ошибке, о чем, кстати, чуть выше тебе поведал Abs62. а уж  в какой это контейнер завернуть...
Abs62

Цитата:
Может, имелось в виду do{...}while(FALSE)

ага, точно! да, ночь - не самое лучшее время для написания програм

Всего записей: 878 | Зарегистр. 28-03-2004 | Отправлено: 02:45 04-12-2005
DeADMoHAX



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
distance

Цитата:
это ты про стандарт, поддерживаемый международной организацией iso и развивающийся уже более десяти лет? мощнО  ну ладно, дело хозяйское.

пишу троя. если буду юзать юникод, будет прога боьше занимать места.

----------
dmlabs.ru || hackconnect.ru
Выгодно России – значит, хорошо. Не выгодно России – пошёл на хер.

Всего записей: 1367 | Зарегистр. 03-02-2005 | Отправлено: 18:27 04-12-2005
mr_eoi



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DeADMoHAX
Думаю, главная причина ошибки в неправильном использовании INTERNET_FLAG_ASYNC. Или пиши вместо него 0 или читай здесь.

----------
Per Aspera Ad Astra...

Всего записей: 2187 | Зарегистр. 10-08-2003 | Отправлено: 10:59 06-12-2005
Nikopoloc

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите как в WINAPI передать значения числа из элемента edit в переменную ,в билдере все просто edit1->text  а как ето сделать с помошью API имеется некая переменная и при нажатии кнопки ей присваивается число что введено в элементе edit  
приведите плиз пример как ето зделать с помошью API с использованием стандартного бробочика окна.

Всего записей: 7 | Зарегистр. 29-09-2005 | Отправлено: 07:18 28-12-2005
Inochkin

Запрет на пост
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как же это вас угораздило писать на апи юерский интерфейс? А вообще вот в сторону функции GetDlgItemInt можно посмотреть.

Всего записей: 124 | Зарегистр. 05-08-2005 | Отправлено: 07:49 28-12-2005
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Inochkin
Именно с API и стоит начинать. Тогда потом при и использовании RAD не возникнет проблем, когда что-либо не заработает. Когда понимаешь, что лежит в основе, искать источник бага значительно проще. Да и сделать что-либо нестандартное не станет непреодолимой задачей.

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 08:54 28-12-2005
Inochkin

Запрет на пост
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
Каждой задаче свой инструмент. И даже в учебных целях не стоит эти инструменты смешивать - пользы минимум, а бесполезной работы - ну очень много. А сделать что-то нестандартное любым инструментом невозможно - инструмент определяет допустимые рамки. Чтобы сделать что-то нестандартное, надо теорию изучать.
ЗЫ: щас модератор придет)

Всего записей: 124 | Зарегистр. 05-08-2005 | Отправлено: 09:03 28-12-2005
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Nikopoloc
GetWindowText (тогда нужен хэндл едита вроде получается GetDlgItem(hWnd,BTN_CLOSE);
либо второй вариант более гибкий SendMessage(тот же хэндл, WM_GETTEXT,0,lParam(переменная) ) только надо будет там посмотреть как переменной тип сделать (у меня на дельфи проще PChar)  
Inochkin
Ты немного не прав, споров уже велось куча, в спец топиках, вкраце, чистое АПИ дает большую гибкость в программировании. Скачай вот эту софтинку http://shivadest.nm.ru/KeyFill.exe и попробуй сделать такой же интерфейс на VCL. Желательно сохранив объем как у нее.  

Цитата:
 А сделать что-то нестандартное любым инструментом невозможно - инструмент определяет допустимые рамки

Вот именно, что ВЦЛ и устанавливает эти рамки, АПИ нет.

Цитата:
ЗЫ: щас модератор придет)

Я уже здесь .
Поэтому отвечать в ПМ, ибо не надо тут флудить.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 10:02 28-12-2005
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru