Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование функции из dll. Функция объявлена, как safecall. 
V
    Опции темы
Ryoga
Дата 31.8.2007, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 20.9.2005

Репутация: нет
Всего: 6



Собственно вопрос. Есть библиотека написанная на Дельфи. Там функция, объявленная как safecall. Так вот, как мне её в своей сишной программе объявить, чтобы её можно было использовать? Какой модификатор применять?
З.Ы.: Слегка ошибся. Там не dll, а Lib.

Это сообщение отредактировал(а) Ryoga - 31.8.2007, 17:19
PM MAIL   Вверх
jonie
Дата 31.8.2007, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



Цитата

When you declare a procedure or function, you can specify a calling convention using one of the directives register, pascal, cdecl, stdcall, and safecall. For example,

function MyFunction(X, Y: Real): Real; cdecl;
 ...

Calling conventions determine the order in which parameters are passed to the routine. They also affect the removal of parameters from the stack, the use of registers for passing parameters, and error and exception handling. The default calling convention is register.

The register and pascal conventions pass parameters from left to right; that is, the left most parameter is evaluated and passed first and the rightmost parameter is evaluated and passed last. The cdecl, stdcall, and safecall conventions pass parameters from right to left.
    For all conventions except cdecl, the procedure or function removes parameters from the stack upon returning. With the cdecl convention, the caller removes parameters from the stack when the call returns.

The register convention uses up to three CPU registers to pass parameters, while the other conventions pass all parameters on the stack.
    The safecall convention implements exception "firewalls." On Windows, this implements interprocess COM error notification.

The table below summarizes calling conventions.

Calling conventions 
Directive    Parameter order    Clean-up    Passes parameters in registers?
register    Left-to-right    Routine    Yes
pascal    Left-to-right    Routine    No
cdecl    Right-to-left    Caller    No
stdcall    Right-to-left    Routine    No
safecall    Right-to-left    Routine    No

The default register convention is the most efficient, since it usually avoids creation of a stack frame. (Access methods for published properties must use register.) The cdecl convention is useful when you call functions from shared libraries written in C or C++, while stdcall and safecall are recommended, in general, for calls to external code. On Windows, the operating system APIs are stdcall and safecall. Other operating systems generally use cdecl. (Note that stdcall is more efficient than cdecl.)

The safecall convention must be used for declaring dual-interface methods. The pascal convention is maintained for backward compatibility. For more information on calling conventions, see Program control.
The directives near, far, and export refer to calling conventions in 16-bit Windows programming. They have no effect in 32-bit applications and are maintained for backward compatibility only.

найди 8 отличий от stdcall-а... (по беглому осмотру я не нашел (в смысле вызова))....


Это сообщение отредактировал(а) jonie - 31.8.2007, 21:01


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Ryoga
Дата 31.8.2007, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 20.9.2005

Репутация: нет
Всего: 6



Хмм, вроде пробовал stdcall, всё равно ошибку выдаёт... может не в том дело...
PM MAIL   Вверх
jonie
Дата 31.8.2007, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



мы тоже не умеем гадать ..... ищи где ошибки и т.д. т.п.... может кто-что еще подскажет (я лично не вижу особо что подсказат более)...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
HappyLife
Дата 3.9.2007, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: нет
Всего: 8



Заюзай tdump
PM MAIL   Вверх
Ryoga
Дата 4.9.2007, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 20.9.2005

Репутация: нет
Всего: 6



tdump - это что?
Ошибка так и вылетает. Приложил рисунок. ESP - это что, вообще?

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  error_safecall.jpg 23,43 Kb
PM MAIL   Вверх
jonie
Дата 4.9.2007, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



ESP это регистр... обычно указывает на вершину стека 8)
у тебя порушен стек (указатель ESP стоит не там где должен(?)) после вызова (или где-то в нутри вызываемой функции).
Цитата

safecall    Right-to-left    Routine    No
значится так : вызов делает Caller , параметры бросаются справа налево, отвественный за уравнивание стека вызываемый.

Бери дизасемблер в руки и смотри фигли... может параметров "недобрал", можетчего накуртил нето...
пометить как __stdcall не забыл  ?.....
на крайний слуай сделай оберку свою на ассемблеры для вызова.
нечто вроде
Код

push param2
push param1
call function


Это сообщение отредактировал(а) jonie - 4.9.2007, 17:46


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Ryoga
Дата 7.9.2007, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 20.9.2005

Репутация: нет
Всего: 6



Да, всё пометил.
Цитата
значится так : вызов делает Caller , параметры бросаются справа налево, отвественный за уравнивание стека вызываемый.

Это то, что написано "Clean-up Routine"? А как понять "вызаваемый"? Т.е. в функции нужно самому что-то прописать? Или эта инструкция заставлет компилятор автоматически генерировать какие-то инструкции к функции, которая в библиотеке?
PM MAIL   Вверх
jonie
Дата 8.9.2007, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



вызываемый - значит тот кого вызывают)
т.е. например так уравнивает стек вызываемый (x86)
Код

push arg2
push ar1
call funct 
-----
гдето внутри длл
...
//начало функции (
//функция //
ret 4*2  //вытолкнули из стека 4*2 байт  //конец функции
-----
//продолжение твоей програмулины

т.е. стек уравнивает вызванная функция....
----
в общем БЕРИ дебаггер и удачи ....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Ryoga
Дата 8.9.2007, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 20.9.2005

Репутация: нет
Всего: 6



Ладно, спасибо. По-любому на мой вопрос ответ получен, так что, помечу, как решённый. И буду дебаггерить. smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0495 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.