Форум: "WinAPI";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
ВнизКак дождаться пока функция вызываемая из 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.03 c