Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-1092758228
Ega23
2004-08-17 19:57
2004.09.05
Навеяло недавними обсуждениями


3-1092131170
natasha
2004-08-10 13:46
2004.09.05
ComboBox в DBGrid


3-1092124172
pavel_guzhanov
2004-08-10 11:49
2004.09.05
Текст запроса


14-1092903488
Ромкааа
2004-08-19 12:18
2004.09.05
Добрый день, скажите плз, кто-нить работал с графиками для форекс


14-1092794139
Думкин
2004-08-18 05:55
2004.09.05
С днем рождения! 18 августа





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский