При выборе меню "Публикация в интернет"окрывается FTP клиент в котором можно настраивать ftp сервер, но при попытке сохранить изменения вылетает ошибка.
В настройках программы есть два вида ftp клиентов: встроенный, встроенный (предидущая версия). Эти клиенты можно запустить так из каталога: ftp.exe и ftp1.exe. ftp.exe не работает, требует установленный моно ftp1.exe работает, но если в расширенным режиме попытаться внести изменения в настройки подключения, то вываливается ошибка см. на скрине Бутылка: e-publis_no_dot
Created attachment 433 [details] скрин
Окно с выбором фтп как в обычном, так и в расширенном режиме одно и то же, странно, почему в обычном всё работает, а в расширенном - нет. последние сообщения в консоле: fixme:ole:OleLoadPictureEx (0xaa6754,0,0,{7bf80980-bf32-101a-8bbb-00aa00300cab},x=16,y=16,f=0,0x1419b00), partially implemented. fixme:ole:OLEPictureImpl_SaveAsFile (0x14112f8)->(0x141a9b8, 0, (nil)), hacked stub. fixme:ole:OLEPictureImpl_FindConnectionPoint no connection point for {33ad4f92-6699-11cf-b70c-00aa0060d393} притом самое последнее повторяется 16 раз.
> Окно с выбором фтп как в обычном, так и в > расширенном режиме одно и то же Ошибся: окна разные но похожее Если подключится к процессу отладчиком, можно поймать исключение. Оно возникает сразу после трейса: fixme:ole:OLEPictureImpl_SaveAsFile (0x140fca0)->(0x14199c0, 0, (nil)), hacked stub.
в этом месте выполняется: return IStream_Write(pstream,This->data,This->datalen,(ULONG*)pcbSize); при этом This->datalen = 0 ! IStream_Write определено как: #define IStream_Write(This,pv,cb,pcbWritten) (This)->lpVtbl->Write(This,pv,cb,pcbWritten) Но интерфейс OLEPictureImpl не имеет метода Write. OLEPictureImpl наследуется от интерфейса IUnknown, тоторый тоже не имеет метода Write Но, как ни странно, но IStream_Write всё-таки вызывается, и возвращает S_OK.
используется Write интерфейса IStream. А он наследует этот метод от ISequentialStream. В итоге вызывается HGLOBALStreamImpl_Write
Не совсем понятно зачем ftp клиенту понадобилось создавать изображение в памяти, а потом его ещё и сохранять на диск. функция OLEPictureImpl_SaveAsFile работает вполне нормально. Ей передаётся входной поток, но она в него ничего не пишет т.к изображение пустое This->datalen = 0 Возможно картинка неверно создаётся до этого. функция OleLoadPictureEx должно создавать новое изображение и инициализировать его из входного потока. Но она реализована частично, и умеет только создавать новое изображение.
Проверил: функци OleLoadPictureEx создаёт и инициализирует изображение из потока. функция OLEPictureImpl_SaveAsFile получает нормальное изображение и пишет его в требуемый поток. Возможно причина в том, что она должна писать данные в поток во внешнем формате (gif,bmp,ico...) а пишет она просто This->data. Надо выяснить в каком формате хранится This->data
переменная keepOrigFormat=TRUE; loadtime_format = 0; Такие значения присваиваюст в конструкторе OLEPictureImpl_Construct. в трейсе видно, что после создание, загружается GIF -изоборажение trace:ole:OLEPictureImpl_Construct returning 0x141cb58 trace:ole:OLEPictureImpl_QueryInterface (0x141cb58)->({7bf80980-bf32-101a-8bbb-00aa00300cab}, 0x32ba1c) trace:ole:OLEPictureImpl_AddRef (0x141cb58)->(ref before=1) trace:ole:OLEPictureImpl_Release (0x141cb58)->(ref before=2) trace:ole:OLEPictureImpl_QueryInterface (0x141cb58)->({00000109-0000-0000-c000-000000000046}, 0x32ba20) trace:ole:OLEPictureImpl_AddRef (0x141cb58)->(ref before=1) fixme:ole:OleLoadPictureEx Data = (nil) datalen = 0 trace:ole:OLEPictureImpl_Load (0x141cb58,0xaba704) trace:ole:OLEPictureImpl_LoadGif screen height 16, width 16 trace:ole:OLEPictureImpl_LoadGif color res 3, backgcolor 255 trace:ole:OLEPictureImpl_LoadGif imgcnt 1 trace:ole:OLEPictureImpl_LoadGif curimage: 16 x 16, on 0x0, interlace 64 trace:ole:OLEPictureImpl_SetBitmap bitmap handle 0x6394 вероятно при этом должно менятся значение loadtime_format
Исключения возникает после OLEPictureImpl_SaveAsFile. Функции передаётся изображение, имеющее формат иконы В этом случае loadtime_format=0. Т.к: This->loadtime_format = magic; magic - это первые 2 бита данных. В случае иконы они нулевые. Не уверен, что в Windows loadtime_format в этом случае 0
Возможно виновато именно окно расширенных настроек. При нажатии на кнопку "Изменить", находясь при этом в обычном режиме. Происходит обработка того же файла иконы. Его можно узнать по длине datalen=6006. При этом никаких ошибок не возникает. Ещё попутно заметил, что при закрытии окна расширенных настроек программа не завершается, приходится принудительно завершать процесс. Возможно программа в одном случае проверяет результат выполнения OLEPictureImpl_SaveAsFile, а в другом - нет. Проблема именно в функции OLEPictureImpl_SaveAsFile. Если, например, вернуть S_OK, при этом не производя запись в выходной поток, то появляется совершенно другое сообщение об ошибке. Скорее всего программа проверяет записанные данные. Но почему в одном случае она это делает, а в другом - нет?
>Проблема именно в функции OLEPictureImpl_SaveAsFile. >Если, например, вернуть S_OK, при этом не >производя запись в выходной поток, то >появляется совершенно другое сообщение об >ошибке. Сейчас такого добится не получается. Программа всегда выдаёт одну и ту же ошибку. Заметил интересный факт: если закрывать расширенные настройки через меню "Выход", то всё программа не повисает. Если же нажимать щёлкать по крестику вверхнем правом, то окно исчезает, а поток остаётся висеть. Думаю, что дело здесь не в OLEPictureImpl_SaveAsFile, а в окне расширенных настроек: без него те же самые функции работают без проблем!
Если всё-таки изменять настройки не в расширенном диалоге, то программа вроде как работает. Коннектится к фтп, передаёт файлы. Только не работает навигация по фтп (справа). Там отображается только директория ".." Поэтому файлы закачиваются только в корень фтп, и в дереве никак не отображаются. Аналогичная навигация по локальным папкам (слева) прекрасно работает.
Результаты тестирования на новых исходниках: При нажатии на кнопку "Расширенный режим" окно пропадает, через некоторое время появляется сообщение об ошибке: Run-time error '76': Path not found при этом в консоле: fixme:mpr:WNetGetConnectionW Don't know how to convert L"\\var\\ftp\\pvt" to an unc Такое сообщение было и раньше, но раньше окно расширенных настроек появлялось, а теперь - нет. Установка IE ничего не меняет
Откладываем, bugs@ в ближайшее время делать ничего не будет.