Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.20;
Скачать: CL | DM;

Вниз

Нужна помощь в переводе файлов заголовков из С++ в 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.063 c
2-1154054923
Leksey
2006-07-28 06:48
2006.08.20
открытие таблиц Excel


2-1154097089
miSTER-TWISTER
2006-07-28 18:31
2006.08.20
загрузить комп


15-1153645976
Der Nechk@ssoff
2006-07-23 13:12
2006.08.20
Монитор


15-1153819954
default
2006-07-25 13:32
2006.08.20
Какую посоветуете книгу по языку C#?


4-1143958737
RL
2006-04-02 10:18
2006.08.20
Ограничение доступа к папке