小编nor*_*aul的帖子

应用程序在退出时挂起SysUtils - > DoneMonitorSupport

我正在编写一个非常线程密集的应用程序,它会在退出时挂起.

我已经跟踪到系统单元并找到了程序进入无限循环的地方.它在sysutils的线19868 - > DoneMonitorSupport - > CleanEventList:

repeat until InterlockedCompareExchange(EventCache[I].Lock, 1, 0) = 0;
Run Code Online (Sandbox Code Playgroud)

我在网上搜索了一个解决方案,发现了几个QC报告:

不幸的是,这些似乎与我的情况无关,因为我不使用TThreadListTMonitor.

我很确定我的所有线程都已完成并且已被销毁,因为所有线程都继承自保持创建/销毁计数的基本线程.

以前有人遇到过类似的行为吗?你知道任何发现根本原因的策略吗?

delphi multithreading delphi-xe2

16
推荐指数
1
解决办法
1148
查看次数

如何修复"无法打开剪贴板:拒绝访问"错误?

我使用以下代码将文本复制到剪贴板:

  Clipboard.Open;
  try
    Clipboard.AsText := GenerateClipboardText;
  finally
    Clipboard.Close;
  end;
Run Code Online (Sandbox Code Playgroud)

看似随意我得到"无法打开剪贴板:拒绝访问"错误.我猜这些错误是由其他应用程序锁定剪贴板引起的,但我似乎从来没有对应该导致锁定的其他应用程序做任何事情.

奇怪的是,我的用户似乎报告了Vista和Windows 7的错误,而不是XP.

有没有办法在尝试访问它之前检查剪贴板是否已锁定?

delphi clipboard copy-paste delphi-2010

15
推荐指数
2
解决办法
3万
查看次数

如何使用Inno安装脚本创建IIS应用程序和应用程序池

我正在尝试使用Inno Setup部署ASP.NET应用程序.

我需要执行以下任务:

  1. 创建IIS应用程序.
  2. 创建一个新的IIS应用程序池并将其.NET版本设置为4.
  3. 将新应用程序的应用程序池设置为新的应用程序池.

我找到了一个创建虚拟目录的脚本,但我需要一个应用程序和应用程序池:

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)

asp.net iis inno-setup

12
推荐指数
1
解决办法
9242
查看次数

有关迁移到多层Delphi架构的建议

我们有一个相对较大的应用程序,它与Firebird(存储过程,视图等)紧密相关.我们现在收到很多支持其他数据库的请求,我们也想将很多功能从客户端移到服务器上.

现在似乎是转向3(4)层架构的好时机.我们已经看过DataSnap 2009和RemObjects SDK/DataAbstract.他们似乎都会做这项工作,但是我们应该注意哪些优点/缺点?是否还有其他可以推荐的框架?

干杯,保罗

database architecture delphi delphi-2009 n-tier-architecture

11
推荐指数
1
解决办法
4896
查看次数

从单个应用程序中的多个线程调用dll函数是否安全?

我正在Delphi 2009中编写一个服务器应用程序,它实现了几种类型的身份验证.每种身份验证方法都存储在一个单独的dll中.第一次使用身份验证方法时,将加载相应的dll.只有在应用程序关闭时才会释放dll.

在服务器线程(连接)之间没有任何形式的同步的情况下访问dll是否安全?

delphi dll multithreading

11
推荐指数
1
解决办法
1万
查看次数

如何创建alpha混合面板?

我试图在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)

delphi delphi-xe2

11
推荐指数
1
解决办法
9560
查看次数

阿尔法降低后,玻璃背景上的绘图文字变得模糊

我正在对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)

delphi transparency gdi+ google-chrome windows-7

10
推荐指数
2
解决办法
2610
查看次数

将TPopupMenu对齐到表单的右侧?

如何将TPopupMenu与表单的右侧对齐?问题是在调用之前似乎没有办法获得弹出菜单的宽度Popup(X, Y: Integer).

我试图获得类似于Chrome中系统菜单的行为.

在此输入图像描述

delphi winapi

10
推荐指数
2
解决办法
1479
查看次数

如何使用Windows身份验证对中间层上的用户进行身份验证

我们有一个用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客户端.

谢谢你提供的所有帮助.

windows delphi authentication winapi windows-authentication

8
推荐指数
1
解决办法
3680
查看次数

找到用户可见的所有控件

如何在表单上找到用户当前可见的所有控件?列出所有可以选中的控件并且不会从视图中隐藏(例如,在不可见的选项卡表上).

delphi delphi-xe2

8
推荐指数
1
解决办法
5533
查看次数