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

Вниз

Помогите пожалуйста перевести код с Си на Delphi   Найти похожие ветки 

 
leonidus ©   (2005-11-30 09:19) [0]

Собственно есть dll, в ней есть функция:

int LWNewRecord( CString NameFile, CString szWord, CString szTransc, CString szTransl );
где
 NameFile - имя файла базы данных с расширением .pdb
 szWord - 1-е слово
 szTransc - 2-е слово
 szTransl - 3-е слово

Функция  открывает файл NameFile для записи, создает если такого файла нет и записывает в него данные, после чего закрывает указанный файл.

возвращает:
 1 - запись успешно добавлена
-1 - ошибка

Ок, теперь есть пример импортирования этой функции на Си:

typedef int (WINAPI *LWNewRecord)(CString, CString, CString, CString);
void CMainFrame::OnTest()
{
   HINSTANCE hinstLib;
   LWNewRecord ProcAdd;

   // Получаем дескриптор модуля DLL.
   hinstLib = LoadLibrary("lwdb.dll");

   // Если дескриптор получен, то пробуем получить адрес функции
   if (hinstLib != NULL)
   {
       ProcAdd = (LWNewRecord) GetProcAddress(hinstLib, _T("LWNewRecord"));

       // Если адрес функции получен, то вызываем функцию.
       if (NULL != ProcAdd) {
                       CString sNameFile= _T("words.pdb");
                       CString sWord= _T("hello");
                       CString sComm= _T("");
                       CString sTransl=_T("привет");

                       int rez= (*ProcAdd)(sNameFile,sWord,sComm,sTransl);
       }
       // Освобождаем модуль DLL.
       FreeLibrary(hinstLib);
   }
}

И теперь простой вопрос, как мне этот код переделать на Delphi?


 
Digitman ©   (2005-11-30 09:54) [1]


> как мне этот код переделать на Delphi?


боюсь что никак.

CString - это С-шный класс в составе MFC, а С-шные и дельфийские классы несовместимы по ран-тайм-структуре


 
Digitman ©   (2005-11-30 09:58) [2]

здесь видится единственное корректное решение - написать на С библиотеку-раппер, которая будет экспортировать одноименную ф-цию с pchar-совместимыми параметрами и будет являться посредником между дельфийским модулем и оригинальной С-шной библиотекой, использующей MFC


 
leonidus ©   (2005-11-30 11:00) [3]

т.е. если я напишу

function LWNewRecord(NameFile, szWord, szTransc, szTransl:string):integer; external "lwdb.dll";

то это не покатит?


 
leonidus ©   (2005-11-30 11:03) [4]

Ок, я могу попросить разработчика поменять тип переменных на аналог string в Delphi, после этого как мне вызвать эту процедуру, я просто с dll никогда не работал?


 
wal ©   (2005-11-30 11:17) [5]

В Си нету "аналога string в Delphi"


 
leonidus ©   (2005-11-30 11:32) [6]

>В Си нету "аналога string в Delphi"

ну текстовые строки то есть, наверняка можно что-то придумать?


 
wal ©   (2005-11-30 11:36) [7]

PChar


 
Sumor   (2005-11-30 21:36) [8]

Во-первых используй для передачи PChar.
Во-вторых не забудь в описании функции написать cdecl (если функция на С++ без WINAPI и других подобных префиксов)
function LWNewRecord(NameFile, szWord, szTransc, szTransl:string):integer; cdecl;external "lwdb.dll";
И третье, по умолчанию компилятор студии добавляет к названию функции дополнительные символы. Чтобы этого избежать должен в проекте DLL быть def-файл с теми названиями функции, которое ты будешь использовать



Страницы: 1 вся ветка

Текущий архив: 2005.12.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
14-1132556014
syte_ser78
2005-11-21 09:53
2005.12.25
самый страшный фильм


2-1133976486
fast2
2005-12-07 20:28
2005.12.25
Как создать dll?


14-1133415994
WondeRu
2005-12-01 08:46
2005.12.25
С днем рождения, Керк!


14-1133370582
palva
2005-11-30 20:09
2005.12.25
Российская кофемолка


14-1133627059
АЗИМУТ
2005-12-03 19:24
2005.12.25
Лог.задачи.