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

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

Ошибка в Делфи 5 [D5, Win2k]


UNIVERSAL ©   (2003-12-22 09:08:00) 

Доброе время суток, коллеги. Ситуация такая. В основном мы пишем на VB, но в VB DLL-ки получаются не совсем "правильные". Так вот понадобилось написать библиотеку на Delphi. В ней только одна функция, которая конвертирует текстовый файл из DOS-кодировки в WIN-кодировку. Вот собственно код DLL:

library FileConverter;
{$DEFINE OEMToChar}
{$IOCHECKS OFF}

uses
SysUtils,
Classes,
windows,
Messages ;

function FileOEMToChar(const FileName:string):integer;stdcall;
var S,Dest:PChar; FSrc,FDst:Text;Path,str:string;//r:bool;
begin
// try
{$IOCHECKS OFF}

FileOEMToChar:=0;
AssignFile (FSrc,FileName);
Reset(FSrc);
Path:=ExtractFilePath(FileName);
AssignFile (FDst,Path+"\001.txt");
Rewrite(FDst);

while not EoF(FSrc) do
begin
readln(FSrc,str);
s:=Pchar(str);
OemToCharA(S, Dest);
str:=String(dest);
writeln(FDst,Dest);
end;
// finally
CloseFile(FSrc);
CloseFile(FDst);
DeleteFile(Pchar(FileName));
RenameFile(Path+"\001.txt",FileName);
// end;
end;
exports
FileOEMToChar;
begin
end.

Компилируется без ошибок, но при вызове из кода программы на VB или VBA генерирует ошибку - Can"t find DLL entry point FileOemToChar in FileConverter.DLL , при этом процедура не отрабатывает.
При переносе процедуры в приложение делфи и трассировке, процедура выполняется полностью, обрабатыавает файл, но в конце трассировки выдаёт сообщение об ошибке: ....Fccess violation at address ... in module Project1.exe. Read of address ...
Не могу понять в чём дело? DLL-ка очень простая, но откуда эта ошибка. Если кто может выполните у себя. Может с Делфи у меня что? А может с головой - давно на Дефях не программировал. Заранее спасибо.


Digitman   (2003-12-24 08:19:00) [1]


> X-MAN (24.12.03 03:48) [9]
> В exprots тоже пиши stdcall


это еще зачем ?


X-MAN   (2003-12-24 03:48:00) [2]

В exprots тоже пиши stdcall


SPeller   (2003-12-23 04:03:00) [3]

А вроде бы всё нормально у него с пямятью. Или строка s = PChar( str ); создаёт отдельный блок памяти с содержимым, равным str, или же просто возвращает указатель на первый символ строки?


KADAN   (2003-12-22 23:05:00) [4]

2 Digitman, UNIVERSAL

а я делаю ето с помощью NEW и reallocmem... я неправ?


Digitman   (2003-12-22 11:24:00) [5]


> какие полезные мысли ещё будут?


для начала ответь себе на вопрос [3] и наведи порядок с распределением памяти в ф-ции

а потом уж про "даунов" поговорим)


Плохиш_   (2003-12-22 11:18:00) [6]


> UNIVERSAL (22.12.03 11:08) [4]
> 2 Плохиш_ по-подробней в этом месте, плз.

PChar + F1, GetMem, FreeMem


UNIVERSAL   (2003-12-22 11:08:00) [7]

2 Плохиш_ по-подробней в этом месте, плз.
2 Digitman - работает, но не совсем удачно, хотя ещё не думал над этим подробно. процедура полностью отрабатывает, файл в нормальном состоянии, но акцесс впадает в даун, т.е. вываливается.
какие полезные мысли ещё будут?


Плохиш_   (2003-12-22 10:33:00) [8]

3. Кто за тебя память для переменной Dest распределять будет?


UNIVERSAL   (2003-12-22 10:26:00) [9]

Спасибо попробую


Digitman   (2003-12-22 09:45:00) [10]

1. Имена экспортируемых идентификаторов регистрочувствительны

Ид-р в библ-ке фигурирует как FileO EMToChar, а ты пытаешься его искать как FileO emToChar

2. Работать это в VB не будет.

Библ.ф-цию в Делфи нужно декларировать как

function FileOEMToChar(const FileName: PChar):integer;stdcall;

а в VB объявлять ByVal FileName as String


Наверх

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