Помощь - Поиск - Пользователи - Календарь
Полная версия: Помогите перевести код Си на Delphi
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Samurai
Здравствуйте!
Появилась проблемка перевода кода программы с си на 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
Про третье забудь сразу - это препроцессор, в Дельфях такого просто нет, придется тебе без дефайна эти строки прямо в коде прописывать...

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

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

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




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

Если можешь напиши пож-та эти как будут выглядеть эти строчки на Delphi
hiv
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) она будет недоступна!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.