При печати в 1С 8.0 Альфа-Авто. После печати нескольких (одного?) документов - теряет принтер по умолчанию. В консоли: trace:commdlg:PrintDlgA (0x75cf1a11): hwndOwner = (nil), hDevMode = (nil), hDevNames = (nil) pp. 0-0, min p 1, max p 0, copies 1, hinst (nil) flags 00000408 (PD_NOPAGENUMS PD_RETURNDEFAULT ) warn:commdlg:PrintDlgA Can't find default printer trace:commdlg:COMDLG32_SetCommDlgExtendedError (00001008) Дебаггер: Backtrace: =>1 0x174a4b3f in frame (+0x4e4b3f) (0x7ed177c8) 2 0x7ed17938 (0x00000001) 3 0x00000000 (0x00000000)
Ошибка проявляется после печати первого документа. Даже из блокнота 1С на пустой базе. Но процессор при этом не удаётся загрузить хоть как-нибудь.
trace:profile:GetPrivateProfileStringW (L"windows", L"device", L"", 0x7ff2a6c0, 280, L"win.ini") trace:profile:PROFILE_GetPrivateProfileString L"windows",L"device",L"",0x7ff2a6c0,280,L"win.ini" trace:profile:PROFILE_Open path: L"c:\\windows\\win.ini" trace:profile:PROFILE_Open MRU Filename: L"c:\\windows\\win.ini", new filename: L"c:\\windows\\win.ini" trace:profile:PROFILE_Open (L"c:\\windows\\win.ini"): already opened, needs refreshing (mru=0) trace:profile:PROFILE_GetString (L"windows",L"device",L""): returning L"" trace:profile:PROFILE_GetPrivateProfileString returning L"", 0 warn:commdlg:PrintDlgA Can't find default printer trace:commdlg:COMDLG32_SetCommDlgExtendedError (00001008)
Для сравнения, лог с нашей машины: trace:profile:PROFILE_Open (L"c:\\windows\\win.ini"): already opened, needs refreshing (mru=0) trace:profile:PROFILE_GetString (L"windows",L"device",L""): returning L"HP,WINEPS.DRV,LPR:hp" trace:profile:PROFILE_GetPrivateProfileString returning L"HP,WINEPS.DRV,LPR:hp", 20
Участок кода функции PROFILE_GetString() key = PROFILE_Find( &CurProfile->section, section, key_name, FALSE, FALSE); PROFILE_CopyEntry( buffer, (key && key->value) ? key->value : def_val, len, TRUE ); TRACE("(%s,%s,%s): returning %s\n", debugstr_w(section), debugstr_w(key_name), debugstr_w(def_val), debugstr_w(buffer) ); return strlenW( buffer );
Если в PROFILE_CopyEntry() передавать def_val, то получаем такую ошибку. Можно предположить, что (key && key->value) == FALSE при повторных вызовах. У нас (key && key->value) выполняется всегда.
При отсутствии в win2k3 принтера по умолчанию возвращается ERROR_FILE_NOT_FOUND и мусор в буфере. Wine в таком случае обновляет информацию о принтере через cups (откуда ещё?), а потом возвращает 1 (успешное выполнение функции). При этом win.ini и реестр дополняются этой информацией.
Никто ничего ни в каком случае не обновляет. Хотелось бы всё же понять, совпадает ли поведение Wine с поведением Windows. Для этого нужно запустить в wine тест в условиях отсутствия принтера по умолчанию.
Windows ничего не обновляет, конечно. Значение-то мы удаляем - пока не назначим снова, ничего не будет.
Сложно говорить об одном и том же на разных языках. Итак, проблема в том, что после нескольких распечаток 1С начинает грузить процессор на 100%, а то и вовсе вылетает. Нужно воспроизвести ситуацию у нас, или начать полномасштабную отладку на сервере клиента. Данные на вход прежние, под этим пользователем пока никто не работает.
Принтер по умолчанию больше не теряется вроде как, во всяком случае проблема воспроизводится гораздо реже. Инцидент можно считать исчерпанным.