Форум: "Основная";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];
Вниз
Помогите пожалуйста перевести код с Си на 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.018 c