Форум: "WinAPI";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
Внизdll Eror Найти похожие ветки
← →
IXT (2004-08-23 10:13) [0]Есть библиотечка:
library WinPKZip;
uses
SysUtils,
Classes, Dialogs,
zf in "zf.pas" {Form1};
{$R *.res}
procedure CreateZipArhive(zipfilename: PChar; maskfiles: PChar); StdCall;
begin
zf.Form1.ZipForge1.FileName:=StrPas(zipfilename);
zf.Form1.ZipForge1.OpenArchive(fmCreate);
zf.Form1.ZipForge1.AddFiles(StrPas(maskfiles));
try
zf.Form1.ZipForge1.TestFiles("*.*");
except
MessageDlg("Errors occurred in the archive file",mtError,[mbOk],0);
end;
zf.Form1.ZipForge1.CloseArchive;
end;
exports
CreateZipArhive;
begin
end.
Вызываю процедурру из нее, а выдает Acceess Violation in WinPKZip;
Вызываю так:unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure CreateZipArhive(zipfilename: PChar; maskfiles: PChar); StdCall;
var
Form1: TForm1;
implementation
procedure CreateZipArhive; external "WinPKZip.dll" name "CreateZipArhive";
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
CreateZipArhive(PChar("c:\111.zip"),PChar("c:\*.txt"));
end;
end.
Что я сделал не так???
← →
tesseract (2004-08-23 10:38) [1]
PChar("что-то")
Так низя надо примерно так:
var
pstr1,pstr2:PChar;
begin
// Если указатель идёт во вне под него необходимо выделить память!
GetMem(pstr1,sizeof("c:\111.zip"));
GetMem(pstr2,sizeof("c:\*.txt"));
pstr1:="c:\111.zip";
pstr2:="c:\*.txt";
CreateZipArhive(pstr1,pstr2);
// Этот код в дельфи 7, не особо нужен, она сама указатели чистит
FreeAndNil(pstr1);
FreeAndNil(pstr2);
end;
← →
IXT (2004-08-23 10:50) [2]Поменял, но выскакивает таже ошибка
procedure TForm1.Button1Click(Sender: TObject);
var
pstr1,pstr2:PChar;
begin
// Если указатель идёт во вне под него необходимо выделить память!
GetMem(pstr1,sizeof("c:\111.zip"));
GetMem(pstr2,sizeof("c:\*.txt"));
pstr1:="c:\111.zip";
pstr2:="c:\*.txt";
CreateZipArhive(pstr1,pstr2);
// Этот код в дельфи 7, не особо нужен, она сама указатели чистит
//FreeAndNil(pstr1);
//FreeAndNil(pstr2);
// CreateZipArhive(PChar("c:\111.zip"),PChar("c:\*.txt"));
end;
P.S.
(D7, WinME)
← →
IXT (2004-08-23 12:48) [3]А разве
pstr1:="c:\111.zip";
не выделит память?
← →
Digitman © (2004-08-23 13:04) [4]
> tesseract (23.08.04 10:38) [1]
ерунду ты городишь
> IXT (23.08.04 12:48) [3]
ты форму-то, к которой обращаешься по zf.Form1, создал где-нибудь ?
что-то не видно, чтобы ты ее создал...
отсюда и AV, вероятно ..
← →
IXT (2004-08-23 14:19) [5]А от чего ее создать:
CreateForm(???);
zf.Form1.Create(???);
КАК ?????????????????????
В проге Application, а в dll?
← →
IXT (2004-08-23 14:22) [6]И вообще форма, она нужна толь, чтобы на нее TZipForge положить!
← →
gek © (2004-08-23 14:27) [7]
procedure CreateZipArhive(zipfilename: PChar; maskfiles: PChar); StdCall;
var
Form_kuku:zf.Form1;
begin
Form_kuku:=zf.Form1.Create("kuku");
Form_kuku.ZipForge1.FileName:=StrPas(zipfilename);
.....
← →
Digitman © (2004-08-23 14:43) [8]
> IXT (23.08.04 14:22) [6]
> И вообще форма, она нужна толь, чтобы на нее TZipForge положить!
если ты привык что-то на что-то "ложить" и иных способов создать объект нужного класса не ведаешь, то это вовсе не означает, что способ "ложить" - единственный в это роде ..
форма вообще тут не нужна ..
procedure CreateZipArhive(zipfilename: PChar; maskfiles: PChar);
begin
with TZipForge.Create(nil) do //создаешь объект
try
//здесь назначаешь необходимые св-ва созданного тобой объекта ZipForge, например :
FileName := zipfilename;
//работаешь с методами объекта
try
OpenArchive(fmCreate);
except
//ошибка создания и/или отркытия файла архива
end;
try
AddFiles(maskfiles);
except
//ошибка добавления файлов в архив
end;
try
TestFiles("*.*");
except
//ошибка тестирования архива
end;
finally
Free; //безусловно уничтожаешь объект, метод закрытия архива необязателен
end;
end;
← →
IXT (2004-08-23 14:43) [9]Что за бред!!!
Form_kuku:zf.Form1;
- [Error] WinPKZip.dpr(11): Constant or type identifier expected
Если поставить TForm1 =>Form_kuku:=zf.Form1.Create("kuku");
- Form1.Create(TComponent) "kuku" - string;
← →
gek © (2004-08-23 14:47) [10]Тьфу-ты...
Application надо
А вообще-то, я бы сделал как Digitman © (23.08.04 14:43) [8] советует
← →
Digitman © (2004-08-23 14:50) [11]
> gek © (23.08.04 14:47) [10]
> Application надо
да на кой шут он там сдался ?
и безо всяких Application все прекрасно работает
← →
gek © (2004-08-23 14:52) [12]Сдаюсь... Что-то у меня сегодня с головой нехорошее
← →
IXT (2004-08-23 14:53) [13]To Digitman
На это были причины:
1. Обем dll не так важен в данном случае и маленькая форма на ней ничего не испортит.
2. TZipForge - сторонний компонент, и неизвестно как он будет себя вести если чего-нибудь ему не до присвоить!
3. Влом описывать все его свойства!
Исходя из всего этого рациональней (как мне кажестя) просто положить его на форму.
P.S.
Просто dll ни разу не делал!!
← →
Digitman © (2004-08-23 15:04) [14]
> IXT (23.08.04 14:53) [13]
1. Что ж .. Хозяин - барин !
2. Оттого что ты создал объект в ран-тайм, а не в дизайн-тайм, ровным счетом ничего не меняется
3. см. п.1
> Исходя из всего этого рациональней (как мне кажестя) просто
> положить его на форму
а мне так НЕ кажется.. ради единственного компонента плодить бестолковые ресурсы в исп.модуле - дурней не придумаешь
> Просто dll ни разу не делал
принципиальной разницы нет
← →
IXT (2004-08-23 15:12) [15]1. Убрал форму на... и и все равно AV (она меня доканает)!
2. Когда кладешь компонент на форму у него по умолчанию свойства. При Create свойства по умолчанию остануться или их надо всех присваевать?
3. После ного как убрал форму и создил его так объем dll увеличился на ~200 Mb
← →
KSergey © (2004-08-23 15:17) [16]> [15] IXT (23.08.04 15:12)
> 3. После ного как убрал форму и создил его так объем dll
> увеличился на ~200 Mb
Чего????
Сначала читаем тут
http://www.delphikingdom.com/helloworld/runtime_comp.htm
Потом что непонятно - спрашиваем.
← →
IXT (2004-08-23 15:28) [17]Очепятка 200 кил!
Факт, правда там до этого Form.Create не было, поэтому и увеличился.
To KSergey
И чего ты меня туда отправил?
← →
Digitman © (2004-08-23 16:14) [18]
> Очепятка 200 кил
ну это еще как-то похоже на правду
> до этого Form.Create не было
а на кой черт ты сейчас-то добавил это ? Что, без формы - труба совсем ? растерялся ?
← →
IXT (2004-08-23 16:17) [19]Теперь AV ругается не на dll а на exe.
Еще раз код:library WinPKZip;
uses
SysUtils,
Classes,
Dialogs,
ZipForge;
{$R *.res}
procedure CreateZipArhive(zipfilename: PChar; maskfiles: PChar);
var MyZip: TZipForge;
begin
MyZip:=TZipForge.Create(nil);
with MyZip do
try
FileName := StrPas(zipfilename);
try
OpenArchive(fmCreate);
except
MessageDlg("ошибка создания и/или отркытия файла архива",mtError,[mbOk],0);
end;
try
AddFiles(StrPas(maskfiles));
except
MessageDlg("ошибка добавления файлов в архив",mtError,[mbOk],0);
end;
try
TestFiles("*.*");
except
MessageDlg("ошибка тестирования архива",mtError,[mbOk],0);
end;
try
CloseArchive;
except
MessageDlg("ошибка",mtError,[mbOk],0);
end;
finally
Free; //безусловно уничтожаешь объект, метод закрытия архива необязателен
end;
end;
exports
CreateZipArhive;
begin
end.
Сама прогаunit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure CreateZipArhive(zipfilename: PChar; maskfiles: PChar); StdCall;
var
Form1: TForm1;
implementation
procedure CreateZipArhive; external "WinPKZip.dll" name "CreateZipArhive";
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
CreateZipArhive("c:\111.zip","c:\*.txt");
end;
end.
← →
IXT (2004-08-23 16:39) [20]То Digitman
Да нет, ты не понял!
Формы небыло и ZipForge не создавался! А сделал TZipForge и объем увеличился. И не делал я Форму, Сказа же "Убрал на..." так всетаки правильнее делать, хоть и ручками.
Но давай по теме! AV на exe ругается!
← →
Digitman © (2004-08-23 16:41) [21]ты соглашения о вызове нарушил
убери отовсюду спецификатор STDCALL, если не планируешь обращение к DLL из не-Делфи-приложений, он тебе не нужен в этом случае ... или верни его на место, если планируешь обращение к ДЛЛ из приложений, созданных не только в делфи, но и в иных средах разработки
← →
IXT (2004-08-23 16:49) [22]Не понял, а если из других, то ошибка то есть, значит дело не в этом. Просто смотрел в книге, там даже в самом простом примере ставят. От него хуже не должно быть, и потом что я нарушил и где?
← →
IXT (2004-08-23 17:06) [23]Все нашел StdCall не было в библиотеке! А ты говоришь что exe и dll "принципиальной разницы нет". Работает!!! Сейчис свойство нужные прописывать буду.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.038 c