написание dll: много вопросов
1) Почему в басике при вызове функции из моей dll вылазит ошибко: [FONT="Lucida Console"]Bad DLL calling convention[/FONT]? Пишу функцию так:
{
...
return TRUE;
}
интересно, что если установить тип вызова:
[FONT="Lucida Console"]extern "C" __declspec(dllexport) __stdcall BOOL myfunc(int a)[/FONT]
то глюк убираеться, НО в експорте моей dll появляються дубликаты функций, только в конце имен добавляеться размер аргументов:
[FONT="Lucida Console"]000011FC myfunc
000011FC myfunc@4[/FONT]
шото в етом духе...
Как убрать ети дубликаты?
2) Функция DllMain объявлена, но при подгрузке/выгрузке dll она не вызываеться. Вызываеться что-то левое, нигде не объявленное...
3) Можно ли как то избавиться от заглушек при вызове API? Наблюдаю такую картину: при вызове API-функции делаеться call на заглушку, от заглушки jmp на реальную функцию. Ет что ради прикола сделано? Я понимаю что jmp на один байт меньше весит, но при отладке такая махинация мешает.
4) Почему аргументы в стек кладуться не инструкцией [FONT="Lucida Console"]push ... [/FONT]а [FONT="Lucida Console"]mov [esp+...],...[/FONT]?
5) Реально вообще импортировать функцию из сторонней dll без либы для нее? А то через LoadLibrary; GetProcAddress неудобно как то...
2. Код пожалуйста
5. Как раз с помощью динамической загрузки (LoadLibrary, GetProcAddress) можно обойтись без lib-файла
Код пожалуйста
{
...
return TRUE;
}
3) Можно ли как то избавиться от заглушек при вызове API? Наблюдаю такую картину: при вызове API-функции делаеться call на заглушку, от заглушки jmp на реальную функцию. Ет что ради прикола сделано? Я понимаю что jmp на один байт меньше весит, но при отладке такая махинация мешает.
4) Почему аргументы в стек кладуться не инструкцией [FONT="Lucida Console"]push ... [/FONT]а [FONT="Lucida Console"]mov [esp+...],...[/FONT]?
3) Сделано не помню для чего, избавиться не получится, только если поменять компилятор.
4) Думаю, какой-либо цели тут нет, просто особенность компилятора.
3) Избавиться нельзя никак и компилятор тут не при чем. У DLL может загружаться в произвольное место адресного пространства, поэтому без промежуточного шага - никак. Код заглушки создается на лету загрузчиком ОС.
5) А чем тебя ситуация с lib'ами не нравится?
Загрузчик ОС ставит только адрес, использовать при этом можно не jmp, а косвенный call.
Flat Assembler, например, делает это через call без jmp.
Например при написании dll на ассемблере либа не генерируеться и подключить ету dll будет некак.
Basic + Asm -- гремучая смесь, однако :)
Еще раз: при явном связывании не нужна библиотека импорта (lib-файл)
implib.exe тебе в помощь