Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.047 c
15-1153609537
Ketmar
2006-07-23 03:05
2006.08.20
сборник стихов Дины Арбениной


15-1153391517
Vlad
2006-07-20 14:31
2006.08.20
Ваша гражданская позиция (небольшой опрос)


15-1153660036
r@bbit
2006-07-23 17:07
2006.08.20
Алгоритм поиска ближайшего простого числа


6-1144164046
WebSqlNeederr
2006-04-04 19:20
2006.08.20
Как отловить, что часть документа загружена?


1-1152261282
dwar
2006-07-07 12:34
2006.08.20
Добавление TAction в TActionList





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский