Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

написание dll: много вопросов

5.1K
05 июня 2008 года
12345678
93 / / 16.12.2006
Буквально два дня назад начал учить C++. Как среду разработки выбрал Dev-C++. Сильно приспичило написать dll. Сразу оговорюсь что dll планирую юзать из VB. Начал писать...

1) Почему в басике при вызове функции из моей dll вылазит ошибко: [FONT="Lucida Console"]Bad DLL calling convention[/FONT]? Пишу функцию так:

 
Код:
extern "C" __declspec(dllexport) BOOL myfunc(int a)
{
    ...
    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 неудобно как то...
535
05 июня 2008 года
Нездешний
537 / / 17.01.2008
1. Конвенции вызова функций в Windows

2. Код пожалуйста

5. Как раз с помощью динамической загрузки (LoadLibrary, GetProcAddress) можно обойтись без lib-файла
5.1K
05 июня 2008 года
12345678
93 / / 16.12.2006
Цитата: Нездешний

Код пожалуйста



 
Код:
BOOL APIENTRY DllMain (HINSTANCE hInst,DWORD reason,LPVOID reserved)
{
    ...
    return TRUE;
}
5.3K
05 июня 2008 года
Somebody
185 / / 24.12.2006
Цитата: 12345678

3) Можно ли как то избавиться от заглушек при вызове API? Наблюдаю такую картину: при вызове API-функции делаеться call на заглушку, от заглушки jmp на реальную функцию. Ет что ради прикола сделано? Я понимаю что jmp на один байт меньше весит, но при отладке такая махинация мешает.
4) Почему аргументы в стек кладуться не инструкцией [FONT="Lucida Console"]push ... [/FONT]а [FONT="Lucida Console"]mov [esp+...],...[/FONT]?


3) Сделано не помню для чего, избавиться не получится, только если поменять компилятор.
4) Думаю, какой-либо цели тут нет, просто особенность компилятора.

562
08 июня 2008 года
tarekon
175 / / 19.08.2003
Цитата: Somebody
3) Сделано не помню для чего, избавиться не получится, только если поменять компилятор.



3) Избавиться нельзя никак и компилятор тут не при чем. У DLL может загружаться в произвольное место адресного пространства, поэтому без промежуточного шага - никак. Код заглушки создается на лету загрузчиком ОС.

5) А чем тебя ситуация с lib'ами не нравится?

5.3K
09 июня 2008 года
Somebody
185 / / 24.12.2006
Цитата: tarekon
3) Избавиться нельзя никак и компилятор тут не при чем. У DLL может загружаться в произвольное место адресного пространства, поэтому без промежуточного шага - никак. Код заглушки создается на лету загрузчиком ОС.


Загрузчик ОС ставит только адрес, использовать при этом можно не jmp, а косвенный call.
Flat Assembler, например, делает это через call без jmp.

5.1K
10 июня 2008 года
12345678
93 / / 16.12.2006
Цитата: tarekon
5) А чем тебя ситуация с lib'ами не нравится?



Например при написании dll на ассемблере либа не генерируеться и подключить ету dll будет некак.

535
10 июня 2008 года
Нездешний
537 / / 17.01.2008
Цитата: 12345678
Например при написании dll на ассемблере либа не генерируеться и подключить ету dll будет некак.



Basic + Asm -- гремучая смесь, однако :)

Еще раз: при явном связывании не нужна библиотека импорта (lib-файл)

562
10 июня 2008 года
tarekon
175 / / 19.08.2003
Цитата: 12345678
Например при написании dll на ассемблере либа не генерируеться и подключить ету dll будет некак.



implib.exe тебе в помощь

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог