我正在编写一个非常线程密集的应用程序,它会在退出时挂起.
我已经跟踪到系统单元并找到了程序进入无限循环的地方.它在sysutils的线19868 - > DoneMonitorSupport - > CleanEventList:
repeat until InterlockedCompareExchange(EventCache[I].Lock, 1, 0) = 0;
Run Code Online (Sandbox Code Playgroud)
我在网上搜索了一个解决方案,发现了几个QC报告:
不幸的是,这些似乎与我的情况无关,因为我不使用TThreadList或TMonitor.
我很确定我的所有线程都已完成并且已被销毁,因为所有线程都继承自保持创建/销毁计数的基本线程.
以前有人遇到过类似的行为吗?你知道任何发现根本原因的策略吗?
我使用以下代码将文本复制到剪贴板:
Clipboard.Open;
try
Clipboard.AsText := GenerateClipboardText;
finally
Clipboard.Close;
end;
Run Code Online (Sandbox Code Playgroud)
看似随意我得到"无法打开剪贴板:拒绝访问"错误.我猜这些错误是由其他应用程序锁定剪贴板引起的,但我似乎从来没有对应该导致锁定的其他应用程序做任何事情.
奇怪的是,我的用户似乎报告了Vista和Windows 7的错误,而不是XP.
有没有办法在尝试访问它之前检查剪贴板是否已锁定?
我正在尝试使用Inno Setup部署ASP.NET应用程序.
我需要执行以下任务:
我找到了一个创建虚拟目录的脚本,但我需要一个应用程序和应用程序池:
procedure CreateIISVirtualDir();
var
IIS, WebSite, WebServer, WebRoot, VDir: Variant;
ErrorCode: Integer;
begin
{ Create the main IIS COM Automation object }
try
IIS := CreateOleObject('IISNamespace');
except
RaiseException(
'Please install Microsoft IIS first.'#13#13'(Error ''' +
GetExceptionMessage + ''' occurred)');
end;
{ Connect to the IIS server }
WebSite := IIS.GetObject('IIsWebService', IISServerName + '/w3svc');
WebServer := WebSite.GetObject('IIsWebServer', IISServerNumber);
WebRoot := WebServer.GetObject('IIsWebVirtualDir', 'Root');
{ (Re)create a virtual dir }
try
WebRoot.Delete('IIsWebVirtualDir', 'eipwebv4');
WebRoot.SetInfo();
except
end;
VDir …Run Code Online (Sandbox Code Playgroud) 我们有一个相对较大的应用程序,它与Firebird(存储过程,视图等)紧密相关.我们现在收到很多支持其他数据库的请求,我们也想将很多功能从客户端移到服务器上.
现在似乎是转向3(4)层架构的好时机.我们已经看过DataSnap 2009和RemObjects SDK/DataAbstract.他们似乎都会做这项工作,但是我们应该注意哪些优点/缺点?是否还有其他可以推荐的框架?
干杯,保罗
database architecture delphi delphi-2009 n-tier-architecture
我正在Delphi 2009中编写一个服务器应用程序,它实现了几种类型的身份验证.每种身份验证方法都存储在一个单独的dll中.第一次使用身份验证方法时,将加载相应的dll.只有在应用程序关闭时才会释放dll.
在服务器线程(连接)之间没有任何形式的同步的情况下访问dll是否安全?
我试图在Delphi XE2中显示一个真正的alpha混合TPanel.我在网上发现了不少尝试,但都没有正常工作.
我想要实现的是一种"半模态"形式.显示在其他控件顶部的窗体,其背景类似于Web浏览器中显示的淡化背景.

我已经让它以基本形式工作,但它遇到以下问题:
这是我到目前为止的努力(基于我在这里找到的一些代码).
unit SemiModalFormU;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;
type
ISemiModalResultHandler = interface
['{0CC5A5D0-1545-4257-A936-AD777E0DAFCF}']
procedure SemiModalFormClosed(Form: TForm);
end;
TTransparentPanel = class(TCustomPanel)
private
FBackground: TBitmap;
FBlendColor: TColor;
FBlendAlpha: Byte;
procedure ColorBlend(const ACanvas: TCanvas; const ARect: TRect; const ABlendColor: TColor; const ABlendValue: Byte);
procedure SetBlendAlpha(const Value: Byte);
procedure SetBlendColor(const Value: TColor);
protected
procedure CaptureBackground;
procedure Paint; override;
procedure WMEraseBkGnd(var msg: TWMEraseBkGnd); message WM_ERASEBKGND;
procedure WMMove(var Message: TMessage); message WM_MOVE; …Run Code Online (Sandbox Code Playgroud) 我正在对TIceTabSet(Chrome标签)组件进行多次更新.其中一项变化是增加透明度.除了文本之外,一切都很好.随着背景的alpha通道变低,文本变得越来越模糊.这是一个截图.

这是绘制标签的代码.其中大部分是原始的TIceTabSet代码.我只是添加了一些更改以使标签透明.对于示例屏幕截图,代码也进行了一些修改.底部的DrawText命令是将文本绘制到画布的位置.
procedure TIceTabSet.InnerDraw(Canvas: TCanvas; TabRect: TRect; Item: TIceTab);
var
graphics : TGPGraphics;
Pen: TGPPen;
Brush: TGPSolidBrush;
path, linePath: TGPGraphicsPath;
linGrBrush: TGPLinearGradientBrush;
font: TGPFont;
solidBrush: TGPSolidBrush;
rectF: TGPRectF;
stringFormat: TGPStringFormat;
DC: HDC;
marginRight: integer;
iconY, iconX: integer;
textStart: Extended;
startColor, EndColor, textColor, borderColor: cardinal;
borderWidth: Integer;
TabProperties: TIceTabProperties;
Alpha: Byte;
begin
DC := Canvas.Handle;
TabProperties := GetTabProperties(Item);
Alpha := Item.Index * 50;
startColor := MakeGDIPColor(TabProperties.TabStyle.StartColor, Alpha);// TabProperties.TabStyle.Alpha);
endColor := MakeGDIPColor(TabProperties.TabStyle.StopColor, Alpha); //TabProperties.TabStyle.Alpha);
textColor := MakeGDIPColor(TabProperties.Font.Color, 255); //TabProperties.TabStyle.Alpha);
borderColor := MakeGDIPColor(TabProperties.BorderColor, …Run Code Online (Sandbox Code Playgroud) 如何将TPopupMenu与表单的右侧对齐?问题是在调用之前似乎没有办法获得弹出菜单的宽度Popup(X, Y: Integer).
我试图获得类似于Chrome中系统菜单的行为.

我们有一个用Delphi编写的服务器,它使用RemObjects DataAbstract/SDK.我们希望使用Windows身份验证对用户进行身份验证,以允许他们访问我们的服务器.
目前我们执行以下操作:
1)客户端应用程序以明文形式将Windows用户名和密码发送到服务器.2)服务器使用以下函数检查凭据:
function ValidateUserLogonAPI(const UserName: string; const Domain: string;
const PassWord: string) : boolean;
var
Retvar: boolean;
LHandle: THandle;
begin
Retvar := LogonUser(PWideChar(UserName),
PWideChar(Domain),
PWideChar(PassWord),
LOGON32_LOGON_NETWORK,
LOGON32_PROVIDER_DEFAULT,
LHandle);
if Retvar then
CloseHandle(LHandle);
Result := Retvar;
end;
Run Code Online (Sandbox Code Playgroud)
当然,这种方法的缺点是用户凭证以明文形式通过网络传递.我们可以对它们进行加密,但加密/解密密钥必须在应用程序中提供.
我相信必须有更好的方法来实现我们的目标.我已经阅读了一些关于令牌的内容,但是并不真正理解它们在这种情况下会如何工作.
请注意,她的解决方案必须适用于Delphi Windows客户端和Delphi Prism ASP.NET客户端.
谢谢你提供的所有帮助.
如何在表单上找到用户当前可见的所有控件?列出所有可以选中的控件并且不会从视图中隐藏(例如,在不可见的选项卡表上).
delphi ×9
delphi-xe2 ×3
winapi ×2
architecture ×1
asp.net ×1
clipboard ×1
copy-paste ×1
database ×1
delphi-2009 ×1
delphi-2010 ×1
dll ×1
gdi+ ×1
iis ×1
inno-setup ×1
transparency ×1
windows ×1
windows-7 ×1