Форум: "Основная";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
ВнизНужна помощь в переводе файлов заголовков из С++ в Delphi Найти похожие ветки
← →
Zilog_ © (2006-07-05 10:13) [0]Ребята! Кто может помочь переписать файлы заголовков DLL библиотеки из под C++ в Delphi. Нужно срочно, а то уволят на ф....г!!!!
← →
MBo © (2006-07-05 10:16) [1]http://www.drbob42.com/delphi/headconv.htm
но ручной работы все равно много останется
← →
PSPF2003 © (2006-07-05 10:19) [2]Программами для перевода не пробовал пользоваться? Попробуй поискать.
← →
Zilog_ © (2006-07-05 10:23) [3]Пробовал, но так - как в С не силен, то попробовал просто загрузить библиотеку, часть функций получилось перевести (работает без ошибок), но вот c процедурным типом облом - вызов происходит нормально, но по завершению работы вылетает AV, видимо описал не правильно, наверное что-то из стека затирается и появляется ошибка.
← →
evvcom © (2006-07-05 10:27) [4]> вызов происходит нормально, но по завершению работы вылетает
> AV
Наверняка, соглашение о вызове перепутал. Раз вызываются нормально, значит stdcall или cdecl указал, но указал неверно. Сюда запости один примерчик исходного объявления и результата.
← →
Zilog_ © (2006-07-05 10:30) [5]
typedef void* SIPX_INST ;
typedef unsigned int SIPX_LINE ;
typedef enum SIPX_CALLSTATE_MAJOR
typedef enum SIPX_CALLSTATE_MINOR
typedef void (*CALLBACKPROC)( SIPX_CALL hCall,
SIPX_LINE hLine,
SIPX_CALLSTATE_MAJOR eMajor,
SIPX_CALLSTATE_MINOR eMinor,
void* pUserData) ;
SIPXTAPI_API SIPX_RESULT sipxListenerAdd(const SIPX_INST hInst,
CALLBACKPROC pCallbackProc,
void* pUserData) ;
Я описал так:
var
Form1: TForm1;
SIPX_CALL:cardinal;
SIPX_LINE:cardinal;
procedure EventMessage( SIPX_CALL:cardinal; SIPX_LINE:cardinal; Major:integer; Minor:integer; UserData:pointer);
function sipxLineListenerAdd(const SIPX_INST:pointer; proc:TEventMEssage; pUserData:pointer): HResult; stdcall external "sipXtapi.dll";
....
result:=sipxLineListenerAdd (phone.header, EventMessage, nil );
Что здесь неправильно?
← →
Ketmar © (2006-07-05 10:40) [6]а для EventMessage кто будет соглашение указывать?
← →
REA (2006-07-05 10:41) [7]А где сами то типы объявлены? А формат вызова точно stdcall, а не cdecl?
unsigned int это все же word наверно
← →
REA (2006-07-05 10:44) [8]Не, cardinal правильнее наверно или Longword
← →
evvcom © (2006-07-05 10:54) [9]> unsigned int это все же word наверно
DWORD или Longword тогда уж. Cardinal более правильно.
> [5] Zilog_ © (05.07.06 10:30)
Важно также привести описания SIPXTAPI_API, SIPX_RESULT, а также твой TEventMessage. И учесть [6]
← →
Zilog_ © (2006-07-05 11:48) [10]
> Важно также привести описания SIPXTAPI_API, SIPX_RESULT,
> а также твой TEventMessage. И учесть [6]
#if defined(_WIN32)
# ifdef SIPXTAPI_EXPORTS
# define SIPXTAPI_API extern "C" __declspec(dllexport) /**< Used for Win32 imp lib creation */
# else
# define SIPXTAPI_API extern "C" __declspec(dllimport) /**< Used for Win32 imp lib creation */
# endif
#else
# define SIPXTAPI_API extern "C" /**< Assume extern "C" for non-win32 platforms */
#endif
.....
typedef enum SIPX_RESULT
{
SIPX_RESULT_SUCCESS = 0, /**< Success */
SIPX_RESULT_FAILURE, /**< Generic Failure*/
SIPX_RESULT_NOT_IMPLEMENTED, /**< Method/API not implemented */
SIPX_RESULT_OUT_OF_MEMORY, /**< Unable to allocate enough memory to perform operation*/
SIPX_RESULT_INVALID_ARGS, /**< Invalid arguments; bad handle, argument out of range,
etc.*/
SIPX_RESULT_BAD_ADDRESS, /**< Invalid SIP address */
SIPX_RESULT_OUT_OF_RESOURCES, /**< Out of resources (hit some max limit) */
} SIPX_RESULT ;
Мое ....
TEventMessage =procedure (SIPX_CALL:cardinal; SIPX_LINE:cardinal; Major:integer; Minor:integer; UserData:pointer);
← →
Zilog_ © (2006-07-05 11:51) [11]
> А где сами то типы объявлены? А формат вызова точно stdcall,
> а не cdecl?
> unsigned int это все же word наверно
А как это узнать? :)
← →
BiN © (2006-07-05 12:02) [12]
> > А где сами то типы объявлены? А формат вызова точно stdcall,
>
> > а не cdecl?
> > unsigned int это все же word наверно
>
>
> А как это узнать? :)
unsigned int - это DWORD он же cardinal
← →
evvcom © (2006-07-05 12:13) [13]> define SIPXTAPI_API extern "C" __declspec(dllimport)
Ну тогда function sipxLineListenerAdd(...): ...; cdecl;
По-моему, именно так надо понимать extern "C" __declspec.
Для пущей уверенности поищи еще CALLBACKPROC и если там тоже extern "C" __declspec, то и procedure EventMessage(...); cdecl; и TEventMessage =procedure(...); cdecl;
← →
Игорь Шевченко © (2006-07-05 12:24) [14]
> По-моему, именно так надо понимать extern "C"
extern "C" надо понимать, как отсутствие манглинга, то есть, к имени функции компилятор не приделывает закодированный список параметров.
← →
Zilog_ © (2006-07-05 14:17) [15]
> procedure EventMessage(...); cdecl; и TEventMessage =procedure(.
> ..); cdecl;
Действительно проканало, значит для всех функций нужно задавать такой параметр? cdecl
← →
evvcom © (2006-07-05 14:20) [16]> значит для всех функций нужно задавать такой параметр? cdecl
Откель я знаю, для всех или не для всех? Надо понимать, что это такое, и смотреть в сишные хедеры. Отсюда и делать выводы.
Только это не параметр. Это директива. См. соглашения о вызовах.
← →
REA (2006-07-05 16:06) [17]extern "C" это [14], а формат вызова описан там, где определены __declspec(dllexport)
← →
icWasya © (2006-07-05 16:19) [18]__declspec(dllexport) и __declspec(dllimport) всё-таки stdcall;
← →
evvcom © (2006-07-05 17:12) [19]> [18] icWasya © (05.07.06 16:19)
Значит в [15] автор только подумал, что проконало.
← →
Zilog_ © (2006-07-06 11:23) [20]
> icWasya © (05.07.06 16:19) [18]
> __declspec(dllexport) и __declspec(dllimport) всё-таки stdcall;
>
> <Цитата>
>
>
> evvcom © (05.07.06 17:12) [19]
> > [18] icWasya © (05.07.06 16:19)
>
> Значит в [15] автор только подумал, что проконало.
Ошибка с AV перестала вылетать, при обработке CallBack функции
← →
evvcom © (2006-07-07 12:08) [21]> [20] Zilog_ © (06.07.06 11:23)
Рано или поздно ты ее словишь, так как со стеком происходят "невероятные" действия. Могут наблюдаться "неожиданные" изменения значений переменных и прочие "непонятные" вещи.
← →
Zilog_ © (2006-07-07 12:44) [22]Да, я заметил, то что через некоторое врем вылетает ошибка причем, ни каких действий не производиться. Соответственно, как тогда ее отловить не имею представления? Все-таки вчем приниципиальная разница директив stdcall и cdecl?
← →
Desdechado © (2006-07-07 12:46) [23]> stdcall и cdecl
а справку почитать?
← →
Ketmar © (2006-07-07 13:55) [24]>Zilog_ © (06.07.06 11:23) [20]
натурально, перестала. потому как раньше у тебя тип вызова callback был register. но то, что нет AV, вовсе не значит, что работает верно.
← →
evvcom © (2006-07-07 14:18) [25]> Все-таки вчем приниципиальная разница директив stdcall и
> cdecl?
В том, какая из сторон чистит стек от параметров. В остальном одинаковы.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.043 c