Главная страница
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.057 c
1-1133153544
Shlomo
2005-11-28 07:52
2005.12.25
Install Shield выдаёт непонятную ошибку?


14-1133791505
Санёк
2005-12-05 17:05
2005.12.25
Олимпиады по информатике.


14-1133550555
AlexWlad
2005-12-02 22:09
2005.12.25
неопределенность понятий...


6-1126549480
oberon
2005-09-12 22:24
2005.12.25
проблема с xml запросом


14-1133566922
VirEx
2005-12-03 02:42
2005.12.25
Почему событие WM_TIMER у окна со временем начинает тормозить, и