delphi程序问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi程序问题相关的知识,希望对你有一定的参考价值。
现在我在delphi程序界面调用dll,要求在开始-运行里面执行程序,
如果执行D:\1\ptest.exe 没有错误,但执行D:\1\ptest.exe a(带参数)就会在
FreeLibrary(DLLHandle)包内存错误,这是怎么回事?
try
sDllPathName := ExtractFilePath(Application.ExeName)+'YZGHDLL.dll';
sDllPro := 'ZYBR_JYSJCX';
DLLHandle := LoadLibrary(Pchar(sDllPathName));
if DLLHandle <> 0 then
begin
@DllProOneStr := GetProcAddress(DLLHandle, pchar(sDllPro));
if Assigned(DllProOneStr) then
begin
DllProOneStr(Pchar(edit1.Text));
end;
end;
finally
FreeLibrary(DLLHandle);
end;
2、你的DLL应该是没问题的。从你DllProOneStr(Pchar(edit1.Text)); 我猜测你的DLL里面应该是使用pchar函数的。 参考技术B 释放dll和加载它的exe有没有带参数应该没有直接的联系,主要看你带了参数的操作和没带参数启动代码有哪些增加和改动,有没有错误或隐含的可能造成内存溢出的情况
我之前也有释放DLL出错的情况,后面在加载DLL的单元里加上,uses ShareMem 就好了,当然可能对你的程序可能不太适用。给你作个参考本回答被提问者和网友采纳
多线程 Delphi 7 App - 应用程序终止问题
【中文标题】多线程 Delphi 7 App - 应用程序终止问题【英文标题】:Multithreaded Delphi 7 App - a problem with app termination 【发布时间】:2010-12-17 20:25:58 【问题描述】:我有一个 TThread 的后代和一个对象列表,每个对象都有自己的此类线程的副本,以及使用 CreateEvent() API 创建的 Event 对象。
不同的对象通过事件触发相互交互。 IE。每个线程必须等到某个其他线程触发其事件。当然,有一个“主”线程,它永久工作,因此永远不会发生自阻塞。这个系统在每个对象的 Execute 方法结束前都可以正常工作。
当我尝试中断所有线程时出现问题,例如通过应用关闭。在这种情况下,我需要一些调用每个线程的 Terminate 方法的外部函数:
for i := 0 to FLayers.Count - 1 do
begin
FLayers.Layer[i].FTerminating := true;
f := true;
while f do
begin
f := FLayers.Layer[i].IsActive;
if f then
begin
Sleep(100);
Application.ProcessMessages;
end;
end;
FLayers.Layer[i].FTerminating := false;
end;
此函数位于 Form.OnClose() 事件中。
问题是大约有两个线程正常终止,但其他所有线程都在 WaitForSingleObject() 调用中停止:
procedure TLayerThread.Execute;
begin
FLayer.FIsActive := true;
...............
repeat
//
if Terminated or
FLayer.FTerminating or
(FLayer.FEvent = INVALID_HANDLE_VALUE) then
begin
break;
end;
//
Fres := WaitForSingleObject(FLayer.FEvent, 100); <<<<<<<<<<<<<<<<<<<<<<<<
until Fres <> WAIT_TIMEOUT;
...........
FLayer.FIsActive := false;
end;
所有线程都只是停止(挂起)在线。上面标记,尽管设置了超时值。
有什么想法吗?
我正在使用 Delphi 7 和 Win XP。
提前致谢。
跟进--
我发现问题在 Execute() 方法中的 Synchronize() 调用中得到解决。我不明白这里有什么问题。 Synchronize() 调用通常的东西,比如视觉控件更新等等。
正如调试器所示,我的线程中没有一个挂在某个 WaitForSingleObject() 调用上,但这不是我在 Execute() 方法中用来协调不同线程的方法,而是另一个调用。我可以假设它在这里:
class procedure TThread.Synchronize(ASyncRec: PSynchronizeRecord);
.................
LeaveCriticalSection(ThreadLock);
try
WaitForSingleObject(SyncProc.Signal, INFINITE);<<<<<<<<<<<<<<<<<<<<<<
finally
EnterCriticalSection(ThreadLock);
end;
..................
有没有人可以告诉我我的代码有什么问题?我从来没有听说过不允许在 Execute() 方法中调用 Synchronize()...
【问题讨论】:
【参考方案1】:您应该使用 WaitForMultipleObjects 而不是 WaitForSingleObject 无限超时并等待两个事件,您的 FLayer.FEvent 和第二个终止事件。
AFAIR 你必须为每个进程创建一个终止事件。 如果 WaitForMultipleObjects 返回终止事件的 ID,则退出循环。
在 OnClose() 方法中,您必须简单地通知所有终止事件。
【讨论】:
很抱歉,您是关于进程终止事件的吗?请注意,我不是要终止进程。让我们将其视为一个中断所有线程的过程。例如。我有“停止处理”菜单项,它不会关闭应用程序,而只是中断所有线程,就像上面显示的那样。而且我不能无限等待事件,因为通常每个线程都必须可以单独中断。简而言之,我的问题是“为什么一个线程终止会导致另一个线程挂起?”谢谢。 在 OnClose() 或其他方法中调用它并不重要。通过为每个线程使用一个关闭事件,您还可以单独结束每个线程。以上是关于delphi程序问题的主要内容,如果未能解决你的问题,请参考以下文章