Приветствую.
У меня какая-то беда с линковщиком — падает при сборке проекта с сабжем.
С вот таким сообщением:
...
Linking...
Delayimp.lib(delayhlp.obj) : error : Internal error during Pass2
ExceptionCode = C0000005
ExceptionFlags = 00000000
ExceptionAddress = 1030C94B
NumberParameters = 00000002
ExceptionInformation[ 0] = 00000000
ExceptionInformation[ 1] = 41436763
CONTEXT:
Eax = 41436761 Esp = 0012F0B4
...
Поставил 5-й СервисПак — не помогло.
Причем ради интереса попытался собрать Рихтеровский пример из "Windows для профессионалов" — та же история.
Может кто-то уже сталкивался? Помогите, плиз.
Здравствуйте Stanislav V. Zudin, Вы писали:
SVZ>Приветствую.
SVZ>У меня какая-то беда с линковщиком — падает при сборке проекта с сабжем.
SVZ>С вот таким сообщением:
SVZ>...
SVZ>Linking...
SVZ>Delayimp.lib(delayhlp.obj) : error : Internal error during Pass2
SVZ> ExceptionCode = C0000005
SVZ> ExceptionFlags = 00000000
SVZ> ExceptionAddress = 1030C94B
SVZ> NumberParameters = 00000002
SVZ> ExceptionInformation[ 0] = 00000000
SVZ> ExceptionInformation[ 1] = 41436763
SVZ>CONTEXT:
SVZ> Eax = 41436761 Esp = 0012F0B4
SVZ>...
SVZ>Поставил 5-й СервисПак — не помогло.
SVZ>Причем ради интереса попытался собрать Рихтеровский пример из "Windows для профессионалов" — та же история.
SVZ>Может кто-то уже сталкивался? Помогите, плиз.
Ну я сталкивался. Мокрософты, IMHO, после какого-то сервиспака линкер поломали, а починить забыли
BTW, если собирать без отладочной информации, линкер не падает. Лечится предельно просто — вместо Delayimp.lib берешь файлы DELAYHLP.CPP и DELAYIMP.H и включаешь в проект. После чего линкер ругается на две неопределенные переменные — указатели на пользовательские коллбэки. Определяешь их, и все работает.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте Sergey, Вы писали:
S>Мокрософты, IMHO, после какого-то сервиспака линкер поломали, а починить забыли BTW, если собирать без отладочной информации, линкер не падает. Лечится предельно просто — вместо Delayimp.lib берешь файлы DELAYHLP.CPP и DELAYIMP.H и включаешь в проект. После чего линкер ругается на две неопределенные переменные — указатели на пользовательские коллбэки. Определяешь их, и все работает.
Спасибо.
Кстати, у меня компилер ругнулся на структуру IMAGE_THUNK_DATA32. Оказалось, в PSDK и Стандартной поставке она определена по-разному. Если подправить DELAYHLP.CPP, то все собирается и работает. Но желание удавить мелкомягких осталось
Здравствуйте, Stanislav V. Zudin, Вы писали:
SV>Здравствуйте Sergey, Вы писали:
SV>
S>>Мокрософты, IMHO, после какого-то сервиспака линкер поломали, а починить забыли BTW, если собирать без отладочной информации, линкер не падает. Лечится предельно просто — вместо Delayimp.lib берешь файлы DELAYHLP.CPP и DELAYIMP.H и включаешь в проект. После чего линкер ругается на две неопределенные переменные — указатели на пользовательские коллбэки. Определяешь их, и все работает.
SV>Спасибо.
SV>Кстати, у меня компилер ругнулся на структуру IMAGE_THUNK_DATA32. Оказалось, в PSDK и Стандартной поставке она определена по-разному. Если подправить DELAYHLP.CPP, то все собирается и работает. Но желание удавить мелкомягких осталось
А можно поподробнее, а то я замучался —
Worker.obj : error LNK2001: unresolved external symbol ___pfnDliFailureHook
Worker.obj : error LNK2001: unresolved external symbol ___pfnDliNotifyHook
Debug/SampleComPlus.dll : fatal error LNK1120: 2 unresolved externals
Здравствуйте, Аноним, Вы писали:
А>А можно поподробнее, а то я замучался —
А>Worker.obj : error LNK2001: unresolved external symbol ___pfnDliFailureHook
А>Worker.obj : error LNK2001: unresolved external symbol ___pfnDliNotifyHook
А>Debug/SampleComPlus.dll : fatal error LNK1120: 2 unresolved externals
Я вылечил так:
поскольку у меня стоит PlatformSDK то структура
IMAGE_THUNK_DATA64 определена —
typedef struct _IMAGE_THUNK_DATA64 {
union {
ULONGLONG ForwarderString; // PBYTE
ULONGLONG Function; // PDWORD
ULONGLONG Ordinal;
ULONGLONG AddressOfData; // PIMAGE_IMPORT_BY_NAME
} u1;
} IMAGE_THUNK_DATA64;
в стандартной поставке переменная AddressOfData определена как PIMAGE_IMPORT_BY_NAME
следовательно в файле delayhlp.cpp в блоке
if (dli.dlp.fImportByName = ((pitd->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0)) {
dli.dlp.szProcName = LPCSTR(pitd->u1.AddressOfData->Name);
}
else {
dli.dlp.dwOrdinal = IMAGE_ORDINAL(pitd->u1.Ordinal);
}
я привёл переменную к типу явно
dli.dlp.szProcName = LPCSTR(((PIMAGE_IMPORT_BY_NAME)pitd->u1.AddressOfData)->Name);
потом в своём COM файле объявил 2 переменные
PfnDliHook __pfnDliNotifyHook;
PfnDliHook __pfnDliFailureHook;
и всё заработало.