powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
25 сообщений из 43, страница 1 из 2
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39501913
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вкратце чтоб хоть было ясно о чем.
Есть служба "Fax". (fxssvc.exe)
Для нее пишется Dll, своя, назовем ее MyExtension.dll
Using the Fax Routing Extension API

Библиотека MyExtension.dll написана (все согласно SDK и с использованием примера), отрабатывал ее как x64 (потому что на Win10 x64 сижу, а там вызывающий процесс fxssvc.exe 64-битный).
Компилируется в VC++2005 (name="Microsoft.VC80.CRT" version="8.0.50727.762") -потому что собаку с этим съел - для гарантированной совместимости со всеми OS.
Одинаковые конфигурации, один проект, различается только "x64 Release" и "Win32 Release".

Имеем: x64 на x64 -dll загружается, Extension работает как задумано. И на Win2003 x64, и на Win10/2016 x64 (и не сомневаюсь что на всех что между). Как часики.

А счас начал проверять "Win32 Release".
На Win XP/Win 2003 x86
Что происходит при старте "Fax". (fxssvc.exe)
Судя по логу MyExtension(32).dll загружается, т.е. ф-ции инициализации FaxExtInitializeConfig/FaxRouteInitialize отрабатывают, а на этом этапе ничего больше и не требуется,
а вот следующую dll (назовем ее MyFSP(32).dll, грузится сразу следом) - сервис fxssvc.exe даже не начинает загружать (лог отсутствует).
Служба "Fax" якобы "запущена", но ничего не работает.
Если убрать (разрегистрировать ) MyExtension(32).dll, то MyFSP(32).dll грузится OK и все работает.

На Win10 x86 веселее.
Что происходит при старте "Fax". (fxssvc.exe)
Судя по логу MyExtension(32).dll загружается, т.е. ф-ции инициализации FaxExtInitializeConfig/FaxRouteInitialize отрабатывают, а на этом этапе ничего больше и не требуется,
следующую dll (MyFSP(32).dll, грузится сразу следом) - сервис fxssvc.exe начинает грузить как и положено (т.е. лог появляется, но только в теч. первых 100мс).
После чего (если запускать службу Fax из консоли MMC ->Services) сервис (вызывающий процесс fxssvc.exe) рушится:
Error 1067: The process terminated unexpectedly.
В журнале имеем это:
Log Name: Application
Source: Microsoft Fax
Date: 8/8/2017 1:34:53 PM
Event ID: 32108
Task Category: Unknown
Level: Error
Keywords: Classic
User: N/A
Computer: SERVER1
Description:
The Fax Service encountered a problem and needed to close.
Error Code: 0x00000000
This error code indicates the cause of the error.

A Windows Error Report was generated with full details about the problem.
The Fax service will restart now.

Log Name: Application
Source: Application Error
Date: 8/8/2017 1:34:53 PM
Event ID: 1000
Task Category: (100)
Level: Error
Keywords: Classic
User: N/A
Computer: SERVER1
Description:
Faulting application name: fxssvc.exe, version: 10.0.15063.0, time stamp: 0xac13f85f
Faulting module name: fxssvc.exe, version: 10.0.15063.0, time stamp: 0xac13f85f
Exception code: 0xc0000005
Fault offset: 0x00046e85
Faulting process id: 0x1fdc
Faulting application start time: 0x01d31031f87af2a1
Faulting application path: C:\Windows\system32\fxssvc.exe
Faulting module path: C:\Windows\system32\fxssvc.exe
Report Id: c2d07d2a-f587-43ee-83cb-a7608f2a0e1b
Faulting package full name:
Faulting package-relative application ID:

Log Name: Application
Source: Windows Error Reporting
Date: 8/8/2017 1:34:53 PM
Event ID: 1001
Task Category: None
Level: Information
Keywords: Classic
User: N/A
Computer: SERVER1
Description:
Fault bucket , type 0
Event Name: APPCRASH
Response: Нет данных
Cab Id: 0

Problem signature:
P1: fxssvc.exe
P2: 10.0.15063.0
P3: ac13f85f
P4: fxssvc.exe
P5: 10.0.15063.0
P6: ac13f85f
P7: c0000005
P8: 00046e85
P9:
P10:

Если убрать (разрегистрировать ) MyExtension(32).dll, то MyFSP(32).dll грузится OK и все работает.

Я понимаю что сумбурно объясняю, что мало кто в этом чего понимает.
Но я даже не знаю как искать причину.

Абсолютно один и тот же проект. (2 месяца над ним работал, ну не одна dll естественно, но эта dll -это основная начинка)
Сделан из стандартного шаблона Win32 Dll в VC++ 2005.
x64 версия на x64 -как часики
такая же точно Win32 - такая подстава. Т.е. если "Fax" fxssvc.exe на 32-бит системе загружает MyExtension(32).dll,
то он либо тупит (на XP/2003 Win32), либо рушится (на Win10 Win32). Проблема явно не в версии OS. И не в рантайме (8.0.50727.762 абсолютно надежен).

Счас пока думаю сделать с нуля "пустую dll", естественно с требуемым набором экспортируемых ф-ций,
но с отсутствием кода в них, ну м.б. элементарный лог (хотя crash и без лога вероятно будет).
Но с кодом как таковым вряд ли что-то не так.

Еще вероятно должен быть какой-то debug для "Fax" fxssvc.exe,
но не уверен что винды его генерируют да еще на таком уровне чтоб это ткнуло в проблему, не нашел пока.
Dll то моя, а процесс ее запускающий - виндовский.
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39501920
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторException code: 0xc0000005
Если не путаю это обращение к несуществующей памяти. Т.е. или твоя DLL куда-то не туда полезла, или заставила полезть EXE.

Сделай функцию записи в лог (открыл файл, записал строку, закрыл) и навтыкай ее вызов везде в коде. Постепенно вычислишь в какой момент вылетает.
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39501924
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Dll то моя, а процесс ее запускающий - виндовский.
ничего страшного, студийный отладчик умеет цепляться к запущенному процессу в том числе и к сервису
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39501947
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСделай функцию записи в лог (открыл файл, записал строку, закрыл) и навтыкай ее вызов везде в коде. Постепенно вычислишь в какой момент вылетает.
Так есть этот лог.
Код: plaintext
1.
2.
3.
4.
08.08.2017@15:44:14.335:---FaxExtInitializeConfig Enter---
08.08.2017@15:44:14.335:---FaxExtInitializeConfig Exit---
08.08.2017@15:44:14.335:---FaxRouteInitialize Enter---
08.08.2017@15:44:14.435:---FaxRouteInitialize Exit---


Лог показывает, что обе ф-ции инициализации отрабатывают, а при старте сервиса от этой dll больше ничего и не требуется.
А exe рушится потом, на Win10 минимум через + 100мс (потому что успевает начать грузить следующую dll что отражено в ее логе).
А на XP он и грузить следующую не хочет (но и не рушится).

Если только предположить, что пытается вызвать еще что-то,
чего там нет (или что там прописано неправильно с т.зр. Win32).
Т.е. до строчки Enter--- дело не доходит.
Но эта штука ж так устроена, что если не найдет в dll какой-либо обязательной экспортируемой ф-ции, то вообще ее грузить не будет. Идей пока нет.

ИзопропилДмитрий77Dll то моя, а процесс ее запускающий - виндовский.
ничего страшного, студийный отладчик умеет цепляться к запущенному процессу в том числе и к сервису
Не стоит у меня студий на тестовых системах во избежании "необъективных тестов" (а x86 - только тестовые),
можно конечно поставить но пока не уверен что надо начинать эту эпопею.
да и не шибко умею работать с этими "отладчиками".
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39501951
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Еще вероятно должен быть какой-то debug для "Fax" fxssvc.exe,
но не уверен что винды его генерируют да еще на таком уровне чтоб это ткнуло в проблему, не нашел пока.
Dll то моя, а процесс ее запускающий - виндовский.

Если служба/процесс крашится, то почему в Windows не настроить для нее автоматический сбор дампов и выполнять анализ в родной студии?
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39501957
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотри FaxExtInitializeConfig, похоже там даются какие-то неправильные настройки для EXE и когда он ими пытается воспользоваться, то вылетает.

PS Как понимаю тоже самое скомпилированное под x64 работает, поэтому исключаем вариант что какие-то настройки не сделаны.
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39501973
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСмотри FaxExtInitializeConfig, похоже там ..
Код: plaintext
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.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
//+---------------------------------------------------------------------------
//
//  function:   FaxExtInitializeConfig
//
//  Synopsis:    This functions is called by the fax service to alert the routing extension that a device 
//               has changed
//
//  Arguments:    pFaxExtGetData               [in] - Pointer to FaxExtGetData
//                pFaxExtSetData               [in] - Pointer to FaxExtSetData
//                pFaxExtRegisterForEvents     [in] - Pointer to FaxExtRegisterForEvents
//                pFaxExtUnregisterForEvents   [in] - Pointer to FaxExtUnregisterForEvents
//                pFaxExtFreeBuffer            [in] - Pointer to FaxExtFreeBuffer
//                bNewDevice           - TRUE means device was added, FALSE means a device was removed 
//
//  Returns:      Standard HRESULT code
//
//----------------------------------------------------------------------------

HRESULT FaxExtInitializeConfig ( 
                PFAX_EXT_GET_DATA               pFaxExtGetData,
                PFAX_EXT_SET_DATA               pFaxExtSetData,
                PFAX_EXT_REGISTER_FOR_EVENTS    pFaxExtRegisterForEvents,
                PFAX_EXT_UNREGISTER_FOR_EVENTS  pFaxExtUnregisterForEvents,
                PFAX_EXT_FREE_BUFFER            pFaxExtFreeBuffer
                )
{  
  BOOL  bReturnValue;

  // открываем запись в лог здесь, т.к. FaxRouteInitialize - вызывается первой при инициализации dll
  // bLoggingEnabled indicates if logging is enabled
  BOOL          bLoggingEnabled;
  // bClearAtStartup indicates if we need to delete log file at startup
  BOOL          bClearAtStartup;
  // szLoggingDirectory indicates the logging directory(\\<MyProga FSP>\\log folder)
  WCHAR         szLoggingDirectory[MAX_PATH_LEN];

  bLoggingEnabled = FALSE;
  bClearAtStartup = TRUE;
  ZeroMemory(szLoggingDirectory, sizeof(szLoggingDirectory));

  //---------------
  // Get data from the ini-file
  WCHAR szCommonAppDataPath[MAX_PATH_LEN] = { 0 };
  if (SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, SHGFP_TYPE_DEFAULT, szCommonAppDataPath) == S_OK) {
    // Set the logging directory name
    if (wcslen(szCommonAppDataPath) < (sizeof(szLoggingDirectory) / sizeof(szLoggingDirectory[0]) - wcslen(FAXROUTE_LOG_DIR))) {
      // directory path is not too long, no need to consider changing szLoggingDirectory size
      if (StringCchCopy(szLoggingDirectory, MAX_PATH_LEN, szCommonAppDataPath) == S_OK) {
        // StringCchCopy is OK
        StringCchCat(szLoggingDirectory, MAX_PATH_LEN, FAXROUTE_LOG_DIR); // if OK then have logging directory in szLoggingDirectory 
      }
    }
    // szIniFilename is the ini file name
    WCHAR  szIniFilename[MAX_PATH] = { 0 };
    // Set the ini-file name
    if (wcslen(szCommonAppDataPath) < (sizeof(szIniFilename) / sizeof(szIniFilename[0]) - wcslen(FAXROUTE_INI_FILE))) {
      // directory path is not too long, no need to consider changing szIniFilename size
      if (StringCchCopy(szIniFilename, MAX_PATH, szCommonAppDataPath) == S_OK) {
        // StringCchCopy is OK
        if (StringCchCat(szIniFilename, MAX_PATH, FAXROUTE_INI_FILE) == S_OK) { 
          // StringCchCat is OK
          bLoggingEnabled = (BOOL)(GetPrivateProfileInt(L"Debug", L"EnableRouteExtLog", 0, szIniFilename));
          bClearAtStartup = (BOOL)(GetPrivateProfileInt(L"Debug", L"ClearRouteExtLogAtStartup", 1, szIniFilename));
        }
      }
    }
  }
  //---------------

  // Open the log file
  bReturnValue = OpenLogFile(bLoggingEnabled, szLoggingDirectory, bClearAtStartup);


  ROUTEDEBUG((L"---FaxExtInitializeConfig Enter---"));
  g_pFaxExtGetData = pFaxExtGetData;
  g_pFaxExtSetData = pFaxExtSetData;
  g_pFaxExtRegisterForEvents = pFaxExtRegisterForEvents;
  g_pFaxExtUnregisterForEvents = pFaxExtUnregisterForEvents;
  g_pFaxExtFreeBuffer = pFaxExtFreeBuffer;
  ROUTEDEBUG((L"---FaxExtInitializeConfig Exit---"));
  return S_OK;
} // FaxExtInitializeConfig



Там ничего умного нету.
"Отсебятиной" является открытие записи в лог.
(до первого ROUTEDEBUG)
Судя по тому, что лог он пишет, с этим все хорошо.
Если про создание лога убрать, краш никуда не девается.
Идея у меня пока убрать вообще весь код, оставив только "пустой скелет",
чтоб он ее просто загружал хотя бы без краша.
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39501975
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Не стоит у меня студий на тестовых системах во избежании "необъективных тестов"
на виртуалке поставь
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39501988
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

у тебя в конце
Код: plaintext
1.
  ROUTEDEBUG((L"---FaxExtInitializeConfig Enter---"));


т.е. после того как весь код уже отработал.

Если FaxRouteInitialize Enter по такому принципу выводится, то ошибка может быть в начале FaxRouteInitialize()

эта строчка должна быть первой в коде функции.
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39501998
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,
нафиг мне виртуалки, у меня круче есть
20584577
Собрал таки себе новый комп для тестов, не топовый конечно.
Intel CPU3260 + мать Gigabite H81 + 8ГБ ОЗУ DDR3 + Nvidia GT730 Asus 2GB GDDR3 (лучшее без кулера)
Конфигурацию выбрал не случайно, т.к. это последнее на что накатывается все подряд от XP (с драйверами!!!) до Win10

Диск 1 TB разбил на 22!!! логических ~ по 40GB (достаточно для одной OS).
Буквы A,B - зарезервированы лучше не использовать
Z-всегда ставится под DWD-ROM.
Остается одна Y под флэшку. + я понял она еще нужна при загрузке с CD (установка OS).

Дык вот, 16 разных OS "от XP до Win10" я туда успешно накатал ...
Короче у меня есть почти все комбинации кроме 32-битной висты и 2008-х (без R2) серверов - на это "уе..ище" моральных сил бы не хватило.
Хотя 2008-й видимо придется ставить, потому что это единственный 32-битный сервер NT>=6.0,
а раз такие проблемы с 32-битной dll, то он будет не лишним для тестов (многолинейность и визуальность Fax Service есть только на серверах).

Ну, понятно, что одну 32-битную ось я могу позволить себе "изгадить" (потом если что и переустановить можно).
Пока не хочу по этому пути идти.
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39502002
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Ну, понятно, что одну 32-битную ось я могу позволить себе "изгадить" (потом если что и переустановить можно).
Пока не хочу по этому пути идти.
В виртуалке можно снимок диска сделать, потестить что надо и затем откатиться к исходному состоянию.
В твоем случае тоже можно: перелей образ раздела с нужной ОС на какой-нибудь HDD и там тести. Или просто забэкапь, потом восстановишь.
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39502007
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДмитрий77,

у тебя в конце
Код: plaintext
1.
  ROUTEDEBUG((L"---FaxExtInitializeConfig Enter---"));


т.е. после того как весь код уже отработал.

Если FaxRouteInitialize Enter по такому принципу выводится, то ошибка может быть в начале FaxRouteInitialize()

эта строчка должна быть первой в коде функции.

Там нету "кода". Там только код открытия записи в лог-файл.
Как я ROUTEDEBUG в файл выведу, не открыв этот самый файл

Код: plaintext
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.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
//+---------------------------------------------------------------------------
//
//  function:   OpenLogFile
//
//  Synopsis:   Open the log file
//
//  Arguments:  [bLoggingEnabled] - indicates if logging is enabled
//				[lpszLoggingDirectory] - indicates the logging directory
//
//  Returns:     TRUE on success
//
//----------------------------------------------------------------------------

BOOL
OpenLogFile(
                BOOL    bLoggingEnabled,
                LPWSTR  lpszLoggingDirectory,
                BOOL    bClearAtStartup
                )
{
        // szLoggingFilename is the logging file name
        WCHAR  szLoggingFilename[MAX_PATH]={0};
        // cUnicodeBOM is the Unicode BOM
        WCHAR  cUnicodeBOM = 0xFEFF;
        DWORD  dwSize;
        HRESULT hr = S_OK;
        BOOL bRetVal = FALSE;

        if (bLoggingEnabled == TRUE) {
                // Set the logging file name
                if (wcslen(lpszLoggingDirectory) >= (sizeof(szLoggingFilename)/sizeof(szLoggingFilename[0]) - 2 - wcslen(FAXROUTE_LOG_FILE))) { 
                        // directory path is too long, consider changing szLoggingFilename size
                        return FALSE;
                }
                hr = StringCchCopy(szLoggingFilename,MAX_PATH,lpszLoggingDirectory );
                if(hr != S_OK)
                {
                        DebugPrint( L"StringCchCopy failed, hr = 0x%x for szLoggingFilename", hr );
                        bRetVal = FALSE;
                        goto Exit;
                }
                hr = StringCchCat(szLoggingFilename,MAX_PATH,L"\\" );
                if(hr != S_OK)
                {
                        DebugPrint( L"StringCchCat failed, hr = 0x%x for szLoggingFilename", hr );
                        bRetVal = FALSE;
                        goto Exit;
                }
                hr = StringCchCat(szLoggingFilename,MAX_PATH,FAXROUTE_LOG_FILE );
                if(hr != S_OK)
                {
                        DebugPrint( L"StringCchCat failed, hr = 0x%x for szLoggingFilename", hr );
                        bRetVal = FALSE;
                        goto Exit;
                }

                if (bClearAtStartup == TRUE)
                {
                  // Create the new log file
                  g_hLogFile = CreateFile(szLoggingFilename,
                    GENERIC_WRITE,
                    FILE_SHARE_READ,
                    NULL,
                    CREATE_ALWAYS,
                    FILE_ATTRIBUTE_NORMAL,
                    NULL);
                  if (g_hLogFile == INVALID_HANDLE_VALUE) {
                    goto Exit;
                  }

                  // Write the Unicode BOM to the log file
                  WriteFile(g_hLogFile,
                    &cUnicodeBOM,
                    sizeof(WCHAR),
                    &dwSize,
                    NULL);
                  bRetVal = TRUE;
                }
                else {
                  // Create the new log file if only exists, otherwise opens an existing file
                  g_hLogFile = CreateFile(szLoggingFilename,
                    GENERIC_WRITE,
                    FILE_SHARE_READ,
                    NULL,
                    OPEN_ALWAYS, // если файл существует, то не перезаписываем
                    FILE_ATTRIBUTE_NORMAL,
                    NULL);
                  if (g_hLogFile == INVALID_HANDLE_VALUE) {
                    goto Exit;
                  }

                  if (GetLastError() != ERROR_ALREADY_EXISTS) {
                    // Write the Unicode BOM to the log file if only just created
                    WriteFile(g_hLogFile,
                      &cUnicodeBOM,
                      sizeof(WCHAR),
                      &dwSize,
                      NULL);
                  }
                  else {
                    SetFilePointer(g_hLogFile, 0, NULL, FILE_END);
                  }
                  bRetVal = TRUE;
                }
        }
        else {
                g_hLogFile = INVALID_HANDLE_VALUE;
        }

Exit:
        return bRetVal;
}


Код, это
Код: plaintext
1.
2.
3.
4.
5.
6.
  g_pFaxExtGetData = pFaxExtGetData;
  g_pFaxExtSetData = pFaxExtSetData;
  g_pFaxExtRegisterForEvents = pFaxExtRegisterForEvents;
  g_pFaxExtUnregisterForEvents = pFaxExtUnregisterForEvents;
  g_pFaxExtFreeBuffer = pFaxExtFreeBuffer;
  return S_OK;
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39502012
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВ твоем случае тоже можно: перелей образ раздела с нужной ОС на какой-нибудь HDD и там тести. Или просто забэкапь, потом восстановишь.
Че ее бэкапить то. Гадишь, форматируешь и заново ставишь (пару часов). Комп то тестовый, чище-лучше. Если это не XP то мультизагрузочное меню этим не испортишь.
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39502075
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал пустышку.
Проект приложен.
Для регистрации - запустить файл TestRouteExt.reg (лежит в папке с проектом)
(в моем случае ImageName C:\777\TestRouteExt.dll -поменять на реальный путь, где лежит Dll)
Запустить службу "Fax".
На x64 (x64 Release) -все OK. Файл "закушен" на время работы службы и не мешает ее работе.
На Win32 Win10 (Win32 Release) при попытке запуска службы
Код: plaintext
1.
Error 1067: The process terminated unexpectedly.


На XP/2003 x86 пока не проверял, но результат прогнозируемый (думаю будет как описал в первом посте)
Я компилирую VC++2005 (name="Microsoft.VC80.CRT" version="8.0.50727.762")
Подключенные файлы :
C:\Program Files\Microsoft SDKs\Windows\v6.1\Include\faxroute.h
C:\Program Files\Microsoft SDKs\Windows\v6.1\Include\faxext.h

VC++ Directories:
C:\Program Files\Microsoft SDKs\Windows\v6.1\Bin
C:\Program Files\Microsoft SDKs\Windows\v6.1\Include
C:\Program Files\Microsoft SDKs\Windows\v6.1\Lib

Идей нет.
Ну только если попытаться повторить пустышку в 13-й студии (но это заведомо ненадежно) и хоть глянуть что будет на Win10-32.


Код: plaintext
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.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
// TestRouteExt.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"


#ifdef _MANAGED
#pragma managed(push, off)
#endif

#include "TestRouteExt.h"


BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
    return TRUE;
}

HRESULT FaxExtInitializeConfig ( 
                PFAX_EXT_GET_DATA               pFaxExtGetData,
                PFAX_EXT_SET_DATA               pFaxExtSetData,
                PFAX_EXT_REGISTER_FOR_EVENTS    pFaxExtRegisterForEvents,
                PFAX_EXT_UNREGISTER_FOR_EVENTS  pFaxExtUnregisterForEvents,
                PFAX_EXT_FREE_BUFFER            pFaxExtFreeBuffer
                )
{  
  return S_OK;
} // FaxExtInitializeConfig

BOOL WINAPI FaxRouteInitialize(IN HANDLE hHeapHandle, IN PFAX_ROUTE_CALLBACKROUTINES pFaxRouteCallbackRoutines )
{
  return TRUE;
}

BOOL WINAPI FaxRouteGetRoutingInfo(IN  LPWSTR lpcwstrRoutingGuid, IN  DWORD dwDeviceId, 
                IN  LPBYTE lpbRoutingInfo, OUT LPDWORD lpdwRoutingInfoSize )
{        
  return TRUE;
}

BOOL WINAPI
FaxRouteSetRoutingInfo(
                IN  LPWSTR lpwstrRoutingGuid,
                IN  DWORD dwDeviceId,
                IN  LPBYTE lpbRoutingInfo,
                IN  DWORD dwRoutingInfoSize
                )
{
  return TRUE;
}


BOOL WINAPI FaxRouteDeviceEnable(
                IN  LPWSTR lpcwstrRoutingGuid,
                IN  DWORD dwDeviceId,
                IN  LONG lEnable
                )
{
  return TRUE;
}

BOOL WINAPI FaxRouteDeviceChangeNotification( IN  DWORD dwDeviceId, IN  BOOL  bNewDevice )
{
  return TRUE;
}


#ifdef _MANAGED
#pragma managed(pop)
#endif



TestRouteExt.h
Код: plaintext
1.
2.
#include <faxroute.h>
#include <faxext.h>



TestRouteExt.def (Linker -> Input -> Module Defenition File)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
LIBRARY	"TestRouteExt"
EXPORTS
    FaxRouteDeviceEnable
    FaxRouteGetRoutingInfo
    FaxRouteSetRoutingInfo
    FaxRouteInitialize
    FaxRouteDeviceChangeNotification
    FaxExtInitializeConfig
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39502137
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

call convention(WINAPI) для FaxExtInitializeConfig не задан

в 64 бит - это пох, в 32 - важно
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39502147
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилcall convention(WINAPI) для FaxExtInitializeConfig не задан
в 64 бит - это пох, в 32 - важно
Вот я счас мувнул проект в 13-ю студию,
он мне 32-бит компилировать не хочет

testrouteext.cpp(29): error C2373: FaxExtInitializeConfig: переопределение; различные модификаторы типа
c:\program files (x86)\windows kits\8.1\include\um\faxext.h(126): см. объявление "FaxExtInitializeConfig"

Что конкретно и где надо дописать в 2005-й?
(из SDK-шного примера вроде ничего существенного не выкидывал).

Код: plaintext
1.
HRESULT WINAPI FaxExtInitializeConfig(


Это?
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39502152
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Это?
да
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39502159
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

Сильно теплее стало это точно.

Понимаешь какое дело, в VS2013 (c:\Program Files (x86)\Windows Kits\8.1\Include\um\FaxExt.h) я счас подправил, он скомпилировался. И 32-битная 10-ка пустышку съела (файл закушен, сервис запустился).

Но мне то надо VS2005, я подправил, теперь эта ругается
1>.\TestRouteExt.cpp(29) : error C2373: 'FaxExtInitializeConfig' : redefinition; different type modifiers
1> C:\Program Files\Microsoft SDKs\Windows\v6.1\Include\faxext.h(114) : see declaration of 'FaxExtInitializeConfig'

А там нет WINAPI.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
//
// The extension should implement and export the following function:
//
HRESULT 
FaxExtInitializeConfig (
    PFAX_EXT_GET_DATA,              // Pointer to FaxExtGetExtensionData in service
    PFAX_EXT_SET_DATA,              // Pointer to FaxExtSetExtensionData in service
    PFAX_EXT_REGISTER_FOR_EVENTS,   // Pointer to FaxExtRegisterForExtensionEvents in service
    PFAX_EXT_UNREGISTER_FOR_EVENTS, // Pointer to FaxExtUnregisterForExtensionEvents in service
    PFAX_EXT_FREE_BUFFER            // Pointer to FaxExtFreeBuffer in service
);
typedef HRESULT (WINAPI *PFAX_EXT_INITIALIZE_CONFIG) (PFAX_EXT_GET_DATA, PFAX_EXT_SET_DATA, PFAX_EXT_REGISTER_FOR_EVENTS, PFAX_EXT_UNREGISTER_FOR_EVENTS, PFAX_EXT_FREE_BUFFER);



(я файл из 6.1 прикрепил целиком).
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39502178
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если в VS2005 сделать так
//#include <faxext.h>

а содержимое faxext.h скопировать в свой .h
+ добавить в своем h. файле эту самую WINAPI
Код: plaintext
1.
2.
3.
4.
5.
6.
//
// The extension should implement and export the following function:
//
HRESULT WINAPI
FaxExtInitializeConfig (
    PFAX_EXT_GET_DATA,              // Pointer to FaxExtGetExtensionData in service


то 32-битник компилируется, файл закусывается и сервис на Win10 32-бит уже не падает (на пустышке Win32 VS2005)

По идее, каждая SDK под свою OS.
6.1 -кажется Win7 или Виста?
но оно и на Win2003 не работало, и в "SDK Win2003" счас глянул тоже нет этой "WINAPI".
Ошибки в старых SDK?

Короче думаю надо делать этот "фокус с добавлением WINAPI и с правкой заголовочного файла", компилировать нормальную dll и смотреть корректность ее работы на разных 32-битках,
предположительно заведется.
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39502205
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

в SDK для 8-10 WINAPI ожидаемо прописано

ошибка может быть идиотской - орлы из MS просто могли собирать околофаксовое добро
указывая опцию компилятора /Gz
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39502222
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Если в VS2005 сделать так
//#include <faxext.h>

а содержимое faxext.h скопировать в свой .h
+ добавить в своем h. файле эту самую WINAPI
Код: plaintext
1.
2.
3.
4.
5.
6.
//
// The extension should implement and export the following function:
//
HRESULT WINAPI
FaxExtInitializeConfig (
    PFAX_EXT_GET_DATA,              // Pointer to FaxExtGetExtensionData in service


Вроде прокатило. Завелась моя dll на 32-битной 10-ке.
Счас дистрибутив сделаю аккуратно и пойду смотреть что будет на XP/2003 x86.

Изопропилошибка может быть идиотской - орлы из MS просто могли собирать околофаксовое добро
указывая опцию компилятора /Gz
Мож орлы, а мож козлы.
Найдешь? Я не нашел. Оригинальный пример из sdk 7.1 приложен (ничего не менял), в более новых sdk че-то не вижу этих примеров.
А ведь эти ж все примеры с упором именно на Win32 писались, и 2005-я студия для них родная.
Т.е. имеем заведомо нерабочую поделку (я этого не заметил только потому что ваял на 64-битной 10-ке и контролировал на 16-м сервере).

Эх, эти б все доки и API лет 10 назад...
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39502247
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на XP/2003 x86
На Win2003 x86 -завелась.
На XP x86 -вроде тоже, но что-то там не фурычит с RoutingExtension (виснет при выполнении метода), но это к вопросу здесь озвученному думаю отношения не имеет, надо код смотреть и тп. (на xp x64 работает, но это по сути сервер).
На 32-битном xp есть ньюансы: там служба факса это System, а не Network Service (начиная с Win2003=NT5.2)

Если верить докам, то Extension вообще не должны поддерживаться на клиентских OS.

FaxServer.RegisterInboundRoutingExtension method
FaxServer.UnregisterInboundRoutingExtension method

This property is not supported in Windows XP, and will return the error: FAX_E_NOT_SUPPORTED_ON_THIS_SKU.
(так и есть, и на любых Win7/Win10 то же самое)

FaxRegisterRoutingExtension function
FaxRoutingInstallationCallback callback function
Дока по партизански молчит, но на XP/Win7/Win10 также стабильно генерит ошибку, на серверах OK.
FaxUnregisterRoutingExtension function
Ну эта вообще не поддерживается и опытно-hex-овым путем удалось понять, что нет ее в принципе нигде, ни A ни W,
хотя аналогичная FaxUnregisterServiceProvider (в доках даже не упомянутая) очень даже присутствует (кроме XP-32) и вполне таки работоспособна.

А суть в том что эта "регистрация" прекрасно прописывается в реестр "ручками" (по образу и подобию), после чего custom-extension абсолютно работоспособен на клиенте (во всяком случае на Win 10 x86/x64 и XP x64 без проблем, на Win7/8.1 не помешало б проверить но предположительно будет OK).
Так что думаю и на XP-32 завести можно, пойду поковыряюсь что там не так (забивать на XP почему-то пока не хочу).
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39502251
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На XP x86 -вроде тоже, но что-то там не фурычит с RoutingExtension (виснет при выполнении метода), но это к вопросу здесь озвученному думаю отношения не имеет, надо код смотреть и тп.
Нашел причину, понатыкав в Debug текстов.
На XP (x86) код (вместе со службой факсов) мертво виснет на строчке (на других OS - даже на Win2003 x86 -не виснет).
Убрать - все работает.

Код: plaintext
1.
2.
        // serialize access to this function so that data is written into the logfile accurately
        EnterCriticalSection( &csRoute );


Задумка авторов горе-примера из SDK видимо следующая:
Routing Method типа выполняется долго: напр. факс конвертируют, пытаются распознать текст, посылают по мылу, печатают.
За это типа немеренное время нечто может написать между строк (видимо другой факс принялся, потому что несколько методов для одного задания выполняются я так понял последовательно в порядке приоритетов в одном потоке, видимо еще когда метод включили/выключили - FaxRouteDeviceEnable тоже в лог пишет и т.п.).

У меня алгоритм проще: я считываю RoutingInfo, копирую TIFF в другое место (оригинал удаляется при выходе из ф-ции), запускаю другой Exe (.Net, ну не готов я на C e-mail-ы отправлять) через CreateProcess, передав этому exe управление делами (окончания его работы не жду). На все про все согласно логу уходит от 0 до 16 миллисекунд в зависимости от компа и как фишка ляжет.
Я вот думаю, вычислять версию OS или м.б. надежнее полностью выкинуть эту CriticalSection и иди она лесом?
Потому как понимаю, deadlock схлопотать с этой кухней вероятность ненулевая (даже не на XP),
а от случайной строчки (между строк) принципиального вреда не будет, да и вероятность этой случайности стремится к нулю.
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39502258
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или м.б. надежнее полностью выкинуть эту CriticalSection и иди она лесом?
Толку от нее конечно немного, но причину понял.
У меня, да и в SDK примере используется конструкция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
{
...
        DWORD dwRetVal = ReadConfiguration(pFaxRoute->DeviceId);
        if(dwRetVal != ERROR_SUCCESS)
        {
                ROUTEDEBUG(( L"ReadConfiguration failed. ec = %d", dwRetVal));
                goto Exit;         
        }       

        if(g_dwFlags == FALSE)    
        {
                ROUTEDEBUG(( L"Routing Method RouteIt is disabled for device %ld", pFaxRoute->DeviceId));
                bRetVal = TRUE;
                goto Exit;
        }
...
        // serialize access to this function so that data is written into the logfile accurately
        EnterCriticalSection( &csRoute );
...
Exit:
...
        LeaveCriticalSection( &csRoute );
        return bRetVal;
}



Что по сути приводит к выполнению в одном потоке
Код: plaintext
1.
2.
LeaveCriticalSection( &csRoute );
EnterCriticalSection( &csRoute );


(два метода, первый из кот. отключен)

Я погуглил, люди исследовали, такая комбинация на XP недопустима (висяк обеспечен), на висте и выше пофиг (и видимо на Win2003 тоже)

В общем если не выкидывать, то надо ставить EnterCriticalSection в начало ф-ции (до выполнения условия, по кот. можно уйти на Exit).
Вот так по любому не виснет:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
{
        // serialize access to this function so that data is written into the logfile accurately
        EnterCriticalSection( &csRoute ); //<<в начало ф-ции
...
        DWORD dwRetVal = ReadConfiguration(pFaxRoute->DeviceId);
        if(dwRetVal != ERROR_SUCCESS)
        {
                ROUTEDEBUG(( L"ReadConfiguration failed. ec = %d", dwRetVal));
                goto Exit;         
        }       

        if(g_dwFlags == FALSE)    
        {
                ROUTEDEBUG(( L"Routing Method RouteIt is disabled for device %ld", pFaxRoute->DeviceId));
                bRetVal = TRUE;
                goto Exit;
        }
...
Exit:
...
        LeaveCriticalSection( &csRoute );
        return bRetVal;
}
...
Рейтинг: 0 / 0
Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
    #39502301
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, а ты развернул на тестовой системе тот же vcredist.exe x86, с библиотеками из которого была собрана твоя библиотека? Что говорит об этой ошибке виндовый лог?
...
Рейтинг: 0 / 0
25 сообщений из 43, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Fax Service + Extension.Dll. Dll(x64) на x64-все OK, Dll(Win32) на Win32 -вышибает службу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]