Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.04 c
6-1091039432
Боян Георгиев
2004-07-28 22:30
2004.10.03
File not found: MNConst.dcu !!!!!!


3-1094625570
VadimKV
2004-09-08 10:39
2004.10.03
Как вычислить факториал (5!) на языке SQL(FB1.5)???


1-1095195660
][ncognito
2004-09-15 01:01
2004.10.03
OnChanging в TreeView


14-1094724754
DiamondShark
2004-09-09 14:12
2004.10.03
Тест клиента


14-1094821151
AllDer
2004-09-10 16:59
2004.10.03
D4 + Win2000





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский