Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.05;
Скачать: CL | DM;

Вниз

Как дождаться пока функция вызываемая из Dll отработает?   Найти похожие ветки 

 
Кириешки   (2004-07-21 17:17) [0]

У меня в программе по нажатию на кнопку подключается библиотека содержащая кучу функций и процедур, из нее вызывается на выполнение функция, а затем, сразу же вызывается та же функция но уже для другого списка. Выглядит это примерно так :

...
h := LoadLibrary("Dll.dll");
if h <= 0 then
ShowMessage("Невозможно подключить библиотеку "Dll.dll".")
else
 begin
  if not Listbox1.items.IndexOf(Edit1.Text)<>-1 then
       begin
          Listbox1.items.Items.add(Edit1.Text);
          SaveList(Listbox1,"Filename.dat"); //Вот эта функция
          Application.ProcessMessages();

          Listbox2.items.add(Edit1.Text);
          SaveList(Listbox2,"Filename2.dat");
...

Короче говоря второй раз функция не хочет запускаться (видимо потому что она еще первый раз не успела отработать), и программа вылетает. Изначально у меня для каждого вызова функции подключалась Dllка, запускалась на выполнение функция и потом выгружалась Dllка, но это было слишком мутно, я начинал запутываться. (Я недавно начал программировать). Решил как-то упростить - не получилось. Может вы подскажите что мне делать?


 
clickmaker ©   (2004-07-21 17:39) [1]


> Кириешки   (21.07.04 17:17)  

Замени использование Application.ProcessMessages(); на вызов функций в отдельном потоке


 
Кириешки   (2004-07-21 23:15) [2]

"Замени использование Application.ProcessMessages(); на вызов функций в отдельном потоке"

Я совсем недавно начал писать на Delphi и незнаю как создать  вызов функции в отдельном потоке. (Я искал в Инете и ничего вразумительного найти не смог). Подскажите если не сложно.


 
GanibalLector ©   (2004-07-22 01:31) [3]

var CommThread : THandle;
   ThreadID:DWord;

function potok(Param: Pointer): DWord; stdcall;
begin
// SABG
Result:=0;
exitthread(Result);
end;

CommThread := CreateThread(nil,0,@potok,nil,0,ThreadID);


 
Digitman ©   (2004-07-22 08:20) [4]

приведи полный текст ф-ции SaveList


 
Внук ©   (2004-07-22 09:39) [5]

Что значит "функция не успела отработать"? Что-то я не вижу никакого намека на использование асинхронности.


 
Кириешки   (2004-07-22 11:50) [6]

Вот польный текст функции

function SaveList(ListName : TListbox; Filename : string):boolean; stdcall;
var
 FileStream: TFileStream;
 Writer: TWriter;
 I: Integer;
begin
 FileStream :=
   TFileStream.Create(Filename,
   fmCreate or fmOpenWrite or fmShareDenyNone);
 Writer := TWriter.Create(FileStream, $FF);
 Writer.WriteListBegin;
 for I := 0 to Listname.items.Count - 1 do
   Writer.WriteString(Listname.items[I]);
 Writer.WriteListEnd;
 Writer.Destroy;
 FileStream.Destroy;
 result := true;
end;

Exports
SaveList;

Если у меня неправильно то что, и как можно сделать грамотнее? Заранее благодарю.


 
Digitman ©   (2004-07-22 12:09) [7]


> Кириешки   (22.07.04 11:50) [6]


да вроде бы ничего подозрительного нет, обычный синхронный алгоритм ...


> программа вылетает


далеко вылетает ? по какому рейсу ?

может, сподобишься привести точную инф-цию о "полете" ?


 
Кириешки   (2004-07-22 19:28) [8]

При нажатии на кнопку у меня по идее, должно происходить сохранение списков. И оно происходило причем даже очень прекрасно, пока функция находилась в самой программе. Но когда я решил перенести функцию в библиотеку дабы немного разгрузить программу при попытке сохранить списки, Delphi стал показывать следующее сообщение :

“Project TryProgramm.exe raised exeption class ElnvalidPointer with message "Invalid pointer operation" “

Причем, при нажатии на кнопку подряд  происходит пять вызовов одной и той же функции только с разными параметрами, и если я закомментирую любые четыре вызова на выбор, то все работает прекрасно. Почему это так ?


 
Serge_   (2004-07-23 04:54) [9]

SaveList(ListName : TListbox; Filename : string);

ListName : TListbox <- не рекомендуется использовать компоненты и классы в качестве параметров функций DLL, и вместо String
рекомендуется использовать Pchar...

//В DLL

procedure SaveList(Lst:pointer;sz:dword;FileName:pchar);stdcall;
var f:dword;
begin
f:=_lcreat(FileName,0);
_lwrite(f,lst,sz)
end;

// А в EXE:

procedure SaveListGate(L:TlistBox;fn:string);
type TSL = procedure (Lst:pointer;sz:dword;FileName:pchar);stdcall;
var p:pointer;
Lib:DWORD;
MySL:TSl;
begin
p:=VirtualAlloc(0,Length(L.Items.Text),mem_commit,page_readwrite);
move(pchar(L.Items.Text)^,p^,Length(L.Items.Text));
Lib:=LoadLibrary("mydll.dll");
MySL:=TSL(GetProcAddress(Lib,"SaveList"));
MySL(p,Length(L.Items.Text),Pchar(fn));
VirtualFree(p,0,mem_release);
end;


 
Serge_   (2004-07-23 04:55) [10]

Там в SaveList _lclose(f) в конце забыл,
короче код прямо тут писал, так что проверить надо...)


 
Кириешки   (2004-07-23 14:54) [11]

Serge_ огромное спасибо за пояснение и пример.
Еще один небольшой вопрос. Я записывал списки в файл через stream для того чтобы они небыли в последствии изменены пользователем, постольку поскольку при открытии их неассоциированной программой - получается непонятный иероглифы а не текст. Можно ли как-нибудь  при таком способе записи данных в файл сделать данные в нем "зашифрованными" для пользователя открывающего его извне? Если нет, то какие дополнительный операции с данными нужно производить чтобы они небыли читаемы извне?


 
Polevi ©   (2004-07-24 13:55) [12]

xor


 
Serge_   (2004-07-24 18:56) [13]

procedure EncryptDecrypt(p:pchar;sz:integer);
var
i:integer;
B:pbyte;
begin
for i:=0 to sz-1 do begin
b:=pbyte(p+i);
b^:=b^ xor $40
end;
end;

procedure SaveList(Lst:pointer;sz:dword;FileName:pchar);stdcall;
var f:dword;
begin
f:=_lcreat(FileName,0);
EncryptDecrypt(Lst,IntegeR(sz));
_lwrite(f,lst,sz);
_lclose(f);
end;

EncryptDecrypt - Используется как для шифровки та и для дешифровки (что следует из название)
xor самый простой способ шифрования... можно усложнить
используя циклические сдвиги или что нить ещё...
можно просто скачать компонент с torry...)


 
DrPass ©   (2004-07-24 23:59) [14]

Как всегда, причина оказалась в Большом Синем Комментарии в проекте DLL. Или в программисте, который (как всегда) его не прочитал...



Страницы: 1 вся ветка

Текущий архив: 2004.09.05;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.049 c
1-1093110654
CrossOut
2004-08-21 21:50
2004.09.05
Как сохранить картинку в буфер, а потом ее от туда считать?


3-1092068498
PFR
2004-08-09 20:21
2004.09.05
BDE блокирует каталог с таблицами даже если закрыты все таблицы


1-1092834503
Erik1
2004-08-18 17:08
2004.09.05
Как прямо записать в структуру TMaps = set of TMap число?


4-1090516343
saimon
2004-07-22 21:12
2004.09.05
Hint как в Windows XP


14-1092579197
Soft
2004-08-15 18:13
2004.09.05
Вирусы добрались до копира:)