IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Помогите перевести код Си на Delphi, dll в С++ и в Delphi
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 2
Пол: Мужской

Репутация: -  0  +


Здравствуйте!
Появилась проблемка перевода кода программы с си на delphi, а именно программа создания dll.
Для удобства разобью непонятные мне вопросы на пункты:
Мне интересно что означает и как это перевести на Delphi, желательно сразу привести аналог

1)

#pragma argsused
int WINAPI DllMain(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}


2)

void* CALLING_CONV (*MemAlloc)(int size) = NULL;


__declspec(dllexport) int CALLING_CONV Initialize (void*, void* (CALLING_CONV *_MemAlloc)(int));
__declspec(dllexport) int CALLING_CONV ConnectToDB ();
__declspec(dllexport) int CALLING_CONV DisconnectFromDB ();
__declspec(dllexport) int CALLING_CONV GetAllVertices (LPVERTEX *lpVerts, ID_T id_parent);
__declspec(dllexport) int CALLING_CONV GetVertexParam (LPPARAM *lpParams, VERTEX vertex, TIMETYPE time_first, TIMETYPE time_last);
__declspec(dllexport) int CALLING_CONV GetSrcVertEdges (LPSRCVERTEDGE *lpsve, VERTEX vertex);
__declspec(dllexport) int CALLING_CONV GetDstVertEdgest (LPDSTVERTEDGE *lpdve, VERTEX vertex);
__declspec(dllexport) LPGRAPH CALLING_CONV GetAllGraphes (ID_T id_obj, int* graph_cnt);
__declspec(dllexport) ID_T CALLING_CONV SaveGraph (GRAPH graph);
__declspec(dllexport) ID_T CALLING_CONV SaveNode (ID_T id_graph, ID_T id_obj, char* node_name, RECT rc);
__declspec(dllexport) ID_T CALLING_CONV SaveLink (ID_T id_graph, ID_T id_obj, ID_T id_node1, ID_T id_node2, char* link_name);
__declspec(dllexport) int CALLING_CONV SaveAggregation (ID_T id_aggrnode, ID_T id_childnode);
__declspec(dllexport) int CALLING_CONV UpdateDB (int bCommit);
__declspec(dllexport) int CALLING_CONV DeleteGraph (ID_T id_graph);
__declspec(dllexport) LPGENODE CALLING_CONV LoadAllNodes (ID_T id_graph, int* node_cnt);
__declspec(dllexport) LPGELINK CALLING_CONV LoadAllLinks (ID_T id_graph, int* link_cnt);
__declspec(dllexport) ID_T CALLING_CONV SaveLG5Net (ID_T id_graph, char* lg5net_name, int lg5_level);
__declspec(dllexport) int CALLING_CONV SaveLG5NetItem (ID_T id_lg5net, ID_T id_node, int item_group);
__declspec(dllexport) LPLG5NET CALLING_CONV LoadLG5Net (ID_T id_graph, int* lg5net_cnt);
__declspec(dllexport) LPLG5NETITEM CALLING_CONV LoadLG5NetItem (ID_T id_lg5net, int* lg5netitem_cnt);




3)
Код

#define TRY_QUEREY_OPEN \
try\
{\
qry->Open();\
}\
catch (EOracleError& err)\
{\
MessageBox (GetActiveWindow(),\
AnsiString("Ошибка при работе с базой данных\n'" + err.Message + "'\n\nОбратитесь к администратору базы данных").c_str(),\
"Ошибка", MB_OK | MB_ICONERROR);\
return NULL;\
}

#define TRY_QUEREY_EXECUTE \
try\
{\
qry->Execute();\
}\
catch (EOracleError& err)\
{\
MessageBox (GetActiveWindow(),\
AnsiString("Ошибка при работе с базой данных\n'" + err.Message + "'\n\nОбратитесь к администратору базы данных").c_str(),\
"Ошибка", MB_OK | MB_ICONERROR);\
return NULL;\
}



Заранеее благодарю всех кто откликнулся на мой вопрос и принял участие.

Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Про третье забудь сразу - это препроцессор, в Дельфях такого просто нет, придется тебе без дефайна эти строки прямо в коде прописывать...

А с остальными-то какая проблема? Заголовки перевести не можешь?
Первая функция, например, будет вот так выглядеть:
function DllMain(hInstance: hInst; reason: longint; lpReserved: Pointer): integer; stdcall;
begin
result := 1
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 2
Пол: Мужской

Репутация: -  0  +


А как перевести

void* CALLING_CONV (*MemAlloc)(int size) = NULL;

__declspec(dllexport) int CALLING_CONV Initialize (void*, void* (CALLING_CONV *_MemAlloc)(int));




что использовать вместо ddlexport

Если можешь напиши пож-та эти как будут выглядеть эти строчки на Delphi
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


2) Кажется это объявление библиотечных функций в списке экспортируемых:
Вот у меня DLL на Delphi:
library mvts218;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
ShareMem, {нужен если используешь длинные строки}
SysUtils,
Classes;

{$R *.res}

function Identificator:shortstring;
begin
Result:='VoIP Softswitch';
end;

procedure GetNames(var RNames :AnsiString);
begin
..... что-то .....
end;

function ConvertDate(sd:shortstring):shortstring;
begin
..... что-то .....
end;

function GetRecord(p,pe:PChar; var Data :AnsiString):PChar;
begin
..... что-то .....
end;

exports Identificator, GetNames, GetRecord; {экспортирование функций DLL (dllexport) }

begin {вот здесь выполняется то, что в cpp прописывается в функции DLLMAIN}
end.

ЗЫ: Заметь функция ConvertDate не экспортируется (ее нет в списке exports) и другим программам (кроме функций самой DLL) она будет недоступна!

Сообщение отредактировано: volvo -


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.05.2024 20:30
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name