![]() |
![]() ![]() ![]() | |
|
Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|| Форумы Здесь вы можете задать свой вопрос и наверняка получите ответ |
ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
| ||
![]() | ||
|
Чтобы не потерять эту дискуссию, сделайте закладку
« предыдущая ветвь | форум | следующая ветвь »
как передать значение из dll [D7, WinXP]
leon2009sp (02.02.23 21:44)Здравствуйте! как из dll передать в программу string, integer , MemoryStream?
procedure LoadFile(FileName: TFileName);
var
MemStr: TMemoryStream;
Title: String;
begin
MemStr:= TMemoryStream.Create;
try
MemStr.LoadFromFile(FileName);
MemStr.Seek(0, soFromBeginning);
//Title := ReadStreamStr( MemStr );
finally
MemStr.Free;
end;
end;
exports
LoadFile index 1;
begin
end.
иfunction LoadFile(FileName: TFileName); external 'project1.dll' index 1;
procedure TForm1.Button1Click(Sender: TObject);
begin
LoadFile('111111.txt');
memo1.Lines.LoadFromFile(LoadFile);
ProgressBar1.position:= LoadFile;
end;
как это правильно сделать? Спасибо!
leon2009sp (03.02.23 07:58) [1]в место
memo1.Lines.LoadFromFile(LoadFile);
этоmemo1.Lines.LoadFromStream(LoadFile);
Rouse_ © (03.02.23 08:50) [2]ShareMem самым первым объяви и в библиотеке и в вызывающей программе (в DPR)
Rouse_ © (03.02.23 08:53) [3]А... у тебя все интереснее, ну и твоя процедура в библиотеке должна возвращать что-то, если это процедура, то возвращать нужно через var параметр, но проще переделать на функцию возвращающую (допустим) тот-же TMemoryStream (и разрушать его будет уже приложение).
Но вообще такой способ достаточно опасный и не желательно так делать. Для этого есть BPL где все за тебя будет сделано.
leon2009sp (03.02.23 09:45) [4]стоит ShareMem
library Project1;
везде его втыкал :(
uses
System.SysUtils,
System.Classes,
Vcl.Forms,
Vcl.Dialogs,
Winapi.Windows, Winapi.Messages, System.Variants, Vcl.Graphics,
Vcl.Controls, Vcl.StdCtrls, Vcl.ComCtrls, Vcl.ExtCtrls,
Vcl.ButtonGroup, Vcl.ToolWin,Math, IdCoder, IdCoder3to4, IdCoderMIME,
IdMessage, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdExplicitTLSClientServerBase, IdMessageClient, IdSMTPBase, IdSMTP,
IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL,
IdServerIOHandler,IniFiles,ShareMem;
leon2009sp (03.02.23 09:47) [5]и функицю делал :
function LoadFile(FileName: TFileName):string;
var
MemStr: TMemoryStream;
Title: String;
begin
MemStr:= TMemoryStream.Create;
try
MemStr.LoadFromFile(FileName);
MemStr.Seek(0, soFromBeginning);
//Title := ReadStreamStr( MemStr );
finally
MemStr.Free;
end;
end;
leon2009sp (03.02.23 09:47) [6]из форму в dll параметры передаются!!! а из dll в form1 нет :(
leon2009sp (03.02.23 09:58) [7]как передать I = ????
procedure LoadFile(FileName: TFileName);
var
MemStr: TMemoryStream; i:integer;
Title: String;
begin
MemStr:= TMemoryStream.Create;
i:=MemStr.size;
т.е. из формы мы передаем имя файла! а как обратно вернуть i:=MemStr.size; пр: чтобы в label.caption:=i;
Rouse_ © (03.02.23 13:41) [8]
> leon2009sp (03.02.23 09:45) [4]
> стоит ShareMem
Я же сказал - самым первым модулем, а не самым последним :)
> leon2009sp (03.02.23 09:47) [5]
> и функицю делал :
Ты сделай так, ты сначала сделай эту функцию у себя в приложении и там с ней поработай, а когда напишешь её правильно, уже тогда переноси в DLL. Сейчас она у тебя делает все что угодно, кроме того что нужно.
leon2009sp (04.02.23 10:02) [9]ругается
function LoadFile(FileName: TFileName):string;
var
MemStr: TMemoryStream;
Title: String; s:string ;
begin
MemStr:= TMemoryStream.Create;
try
MemStr.LoadFromFile(FileName);
MemStr.Seek(0, soFromBeginning);
s:='0000000000000000000';
// Title := ReadStreamStr( MemStr );
finally
MemStr.Free;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
type
TFunc = function : String;
var
Proc : Tfunc ; StrMsg:string;
begin
LoadFile('test.txt');
Proc := @LoadFile;
StrMsg := Proc;
ShowMessage(StrMsg);
end;
Rouse_ © (04.02.23 10:36) [10]Ну конечно ругается, обьявляешь одно вызываешь другое...
leon2009sp (05.02.23 06:52) [11]я не знаю как извлечь из функции параметр, кроме если поставить result а если их несколько? result1 result2 ?????
у меня получилось только передавать в функцию name, string, integer;function LoadFile(var s:string; const FileName: TFileName):string;
var
MemStr: TMemoryStream;
Title: String; i:integer ;
begin
showmessage(s);
showmessage(FileName);
end;procedure TForm1.Button1Click(Sender: TObject);
var ms:string;
begin
ms:='11111111';
LoadFile(ms, 'test.txt');
end;
leon2009sp (05.02.23 17:29) [12]Так правильно?
function LoadFile(const FileName: TFileName; s:TStrings):boolean;
var
MemStr: TMemoryStream;
Title: String; i:integer ;
begin
MemStr:= TMemoryStream.Create;
try
MemStr.LoadFromFile(FileName);
MemStr.Seek(0, soFromBeginning);
//ReadStreamStr( MemStr );
s.LoadFromStream(MemStr);
result:=true;
finally
MemStr.Free;
end;
end;
иprocedure TForm1.Button1Click(Sender: TObject);
begin
LoadFile('test.txt', memo1.Lines);
end;
leon2009sp (05.02.23 17:46) [13]меня смущает, что я файл можно сказать два раза гружу
s.LoadFromStream(MemStr);
leon2009sp (05.02.23 19:14) [14]
type TCallBack = procedure (progress, total: Cardinal);
function LoadFile(const FileName: TFileName; s:TStrings; cbProgress: TCallBack):boolean;
var
MemStr: TMemoryStream; Title: String;
begin
MemStr:= TMemoryStream.Create;
try
MemStr.LoadFromFile(FileName);
MemStr.Seek(0, soFromBeginning);
//ReadStreamStr( MemStr );
s.LoadFromStream(MemStr);
cbProgress(MemStr.Size,1);
result:=true;
finally
MemStr.Free;
end;
end;
procedure cbProgress(Curr, Max: Cardinal);
begin
Form1.ProgressBar1.Max:= (Curr div 1024) div 1014;
Form1.ProgressBar1.Position :=Form1.ProgressBar1.Max; // Curr * 100 div Max; 5% ot 50 = (5*50)/100
Form1.Label1.Caption:=inttostr(Form1.ProgressBar1.Position);
Form1.Label2.Caption:=inttostr(Form1.ProgressBar1.max);
Application.ProcessMessages;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
LoadFile('sortmail1.txt', memo1.Lines, @cbProgress);
end;
не знаю что делать с:s.LoadFromStream(MemStr);
leon2009sp (05.02.23 19:17) [15]потом с начало все грузится в мемо, а только потом срабатывает progressbar
Rouse_ © (06.02.23 08:09) [16]Так правльно, только не понятно что ты в итоге получить хочешь? Ты текстом лучше напиши
leon2009sp (06.02.23 09:20) [17]я хочу загрузить текст в мемо, при этом загрузка отображается в progressbar через функции т.к. в последующем функцию хочу переместить в dll
Rouse_ © (06.02.23 22:31) [18]Так не получится, точнее можно, но для этого нужно писать прокси-стрим у которого сделать событие уведомляющее о прогрессе загрузки и грузить через него. Зачем это тебе? Чтобы увидеть реальный прогресс, файл должен быть достаточно большим на диске, а под большой файл у тебя может просто не быть свободных страниц в памяти идущих непрерывно чтобы вместить весь такой обьем.
leon2009sp (07.02.23 08:39) [19]Можно же просто передавать значение из функции в форму? не в dll PrgoressBar описывать, а передавать готовые значения.
вот на этом я остановился :( я не знаю как передать MemStr в форму и вообще такое возможно? т.е.
function LoadFile(const FileName: TFileName):string;
var
MemStr: TMemoryStream; Title: String;
begin
MemStr:= TMemoryStream.Create;
try
MemStr.LoadFromFile(FileName);
MemStr.Seek(0, soFromBeginning);
finally
MemStr.Free;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
LoadFile('40.txt'); = закидываем файл в функцию
// нужно получить обратные значения
=============================
memo1.Lines.LoadFromStream(MemStr);
и
I:=MemStr.size; - я это не могу понять как сделать.
=============================
end;
Rouse_ © (07.02.23 08:54) [20]Перестань программировать наугад!
function LoadFile(const FileName: TFileName):string;
var
MemStr: TStringStream;
begin
MemStr:= TStringStream.Create;
try
MemStr.LoadFromFile(FileName);
Result := MemStr.DataString;
finally
MemStr.Free;
end;
end;
leon2009sp (09.02.23 14:03) [21]ошибки:
Dllfunction LoadFile(const FileName: TFileName):string;
var
MemStr: TStringStream;
begin
MemStr:= TStringStream.Create;
try
MemStr.LoadFromFile(FileName);
MemStr.Seek(0, soFromBeginning);
Result := MemStr.DataString;
finally
MemStr.Free;
end;
end;
function SaveFile(const FileName: TFileName; text:string):string;
var
MemSave: TStringStream;
begin
MemSave:= TStringStream.Create;
try
MemSave.WriteString(text);
MemSave.savetofile(FileName);
finally
MemSave.Free;
end;
end;
exports
LoadFile,
SaveFile;
begin
end.
Forma_1function LoadFile(const FileName: TFileName):string; external 'Project1.dll'; // Необходимо точно указывать имя файла во избежании недоразумений.
function SaveFile(const FileName: TFileName; text:string):string; external 'Project1.dll';
with OpenDialog1 do
if Execute then memo1.Lines.Text:=LoadFile(OpenDialog1.FileName);
и
with SaveDialog1 do
if Execute then SaveFile(SaveDialog1.FileName, memo1.Lines.Text);
SaveDialog1 = ошибок нет все сохраняет, а вот при открытии выдает ошибки, ругается.
leon2009sp (09.02.23 14:05) [22]
Project Project1.exe raised exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'.
leon2009sp (09.02.23 19:11) [23]а в 32битах все отлично работает
leon2009sp (09.02.23 19:47) [24]делаю так:
MemStr.LoadFromFile(FileName);
MemStr.Seek(0, soFromBeginning);
Result := '111111111';
все отлично аMemStr.LoadFromFile(FileName);
MemStr.Seek(0, soFromBeginning);
Result := MemStr.DataString;
Глюк
leon2009sp (09.02.23 20:20) [25]документ перекодировал в ANSI и заработало :((( это теперь так каждый текст придется ?
leon2009sp (09.02.23 20:29) [26]или ShortString = правильный ответ?
leon2009sp (09.02.23 21:14) [27]забивается - ошибки: два раза файл не откроешь
leon2009sp (10.02.23 09:44) [28]ошибка возникает когда я открываю маленькие файлы кб если файл открываю 8 мб работает, меньше глюк.
leon2009sp (10.02.23 13:33) [29]если функция находится в форме = то все отлично работает, но если функция уже в DLL _= то файлы которые меньше 164000 б = выскакивает ошибка (выше).
Разрешается использование тегов форматирования текста:
версия для печати
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)
|
![]() ![]() ![]() |