![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите пожалуйста перевести код с Си на 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, а С-шные и дельфийские классы несовместимы по ран-тайм-структуре