Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите пожалуйста перевести код с Си на Delphi [D6, WinXP]


leonidus ©   (2005-11-30 09:19:00) 

Собственно есть 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?


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

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


wal   (2005-11-30 11:36:00) [2]

PChar


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

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

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


wal   (2005-11-30 11:17:00) [4]

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


leonidus   (2005-11-30 11:03:00) [5]

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


leonidus   (2005-11-30 11:00:00) [6]

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

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

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


Digitman   (2005-11-30 09:58:00) [7]

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


Digitman   (2005-11-30 09:54:00) [8]


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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо