DelayLoad
От: Stanislav V. Zudin Россия  
Дата: 16.09.02 18:20
Оценка:
Приветствую.
У меня какая-то беда с линковщиком — падает при сборке проекта с сабжем.
С вот таким сообщением:
...
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
Re: DelayLoad
От: Sergey Россия  
Дата: 17.09.02 07:00
Оценка: 9 (1)
Здравствуйте 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: DelayLoad
От: Stanislav V. Zudin Россия  
Дата: 17.09.02 12:45
Оценка:
Здравствуйте Sergey, Вы писали:


S>Мокрософты, IMHO, после какого-то сервиспака линкер поломали, а починить забыли BTW, если собирать без отладочной информации, линкер не падает. Лечится предельно просто — вместо Delayimp.lib берешь файлы DELAYHLP.CPP и DELAYIMP.H и включаешь в проект. После чего линкер ругается на две неопределенные переменные — указатели на пользовательские коллбэки. Определяешь их, и все работает.


Спасибо.
Кстати, у меня компилер ругнулся на структуру IMAGE_THUNK_DATA32. Оказалось, в PSDK и Стандартной поставке она определена по-разному. Если подправить DELAYHLP.CPP, то все собирается и работает. Но желание удавить мелкомягких осталось
_____________________
С уважением,
Stanislav V. Zudin
Re[3]: DelayLoad
От: Аноним  
Дата: 21.12.02 22:32
Оценка:
Здравствуйте, 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
Re[4]: DelayLoad
От: Аноним  
Дата: 21.12.02 22:44
Оценка:
Здравствуйте, Аноним, Вы писали:
А>А можно поподробнее, а то я замучался —

А>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;

и всё заработало.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.