小编Rep*_*til的帖子

Delphi - 调用Win API

在以下代码中调用Win API有什么区别

代码#1:

uses
  Winapi.ActiveX;

procedure Foo();
var
  pv :Pointer;
begin
  CoTaskMemFree(pv);
end;
Run Code Online (Sandbox Code Playgroud)

代码#2:

procedure CoTaskMemFree(
    pv: Pointer
    ); stdcall; external 'ole32.dll';

procedure Foo();
var
  pv :Pointer;
begin
  CoTaskMemFree(pv);
end;
Run Code Online (Sandbox Code Playgroud)

我注意到代码1的可执行文件大小(161,792字节)大于代码2的可执行文件(23,552字节).我认为因为Code 1也会编译以下单元.

unit Winapi.ActiveX;

uses Winapi.Messages, System.Types, Winapi.Windows;
Run Code Online (Sandbox Code Playgroud)
  • 使用#Code2上使用的方法还有其他优点吗?
  • 这样做有风险吗?

delphi winapi

9
推荐指数
1
解决办法
1332
查看次数

Delphi - TStringList保存/加载流编码

我工作TStringListTMemeorySteam很多在我的项目.

  msTmp := TMemoryStream.Create;
  try
     lTemp.SaveToStream(msTmp, TEncoding.Unicode);
  finally
    msTmp.Free;
  end;
  .....
  lTemp := TStringList.Create;
  try
     lTemp.LoadFromFile(msTmp, TEncoding.Unicode);
  finally
    lTemp.Free;
  end;
Run Code Online (Sandbox Code Playgroud)

我如何能够 在我的项目中告知LoadFromStream()并且SaveToStream()默认情况下流是UTF-16编码的,而不包括每次调用中的编码类型.所以我只能打电话LoadFromStream(msTmp),它将加载UTF-16编码.

delphi delphi-10-seattle

5
推荐指数
1
解决办法
6046
查看次数

当另一个控件具有焦点时,我的表单如何检测KeyDown事件?

procedure TMainForm.KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (GetKeyState(Ord('Q'))<0) and (GetKeyState(Ord('W'))<0) and (GetKeyState(Ord('E'))<0)
  then ShowMessage('You pressed it');
end;
Run Code Online (Sandbox Code Playgroud)

只有将焦点设置为主窗体时,上述事件才有效.如果我运行应用程序并继续按Tab并将焦点更改为Form上的任何控件,它将禁用此事件,直到我们再次将Focus更改为主窗体?

问题是, 即使焦点不在主窗体中,我怎么能检测到三个按键被按下?

我也想过如果我使用RegisterHotKey,但在我的应用程序运行时注册Q,W和E并不是一个好主意.

procedure TMainForm.WMHotKey(var Msg: TWMHotKey);
begin
  if ActiveCaption = 'my Form Caption' then
  Begin
    if Msg.HotKey = HotKey1 then
    begin
      //DoSomething;
    end
    else
    if Msg.HotKey = HotKey2 then
    begin
      //DoSomething;
    end;
  End
  else
   //DoSomething;
end;
Run Code Online (Sandbox Code Playgroud)

delphi keydown registerhotkey

4
推荐指数
1
解决办法
3663
查看次数

如何在Indy SSL中设置ConnectTimeout / ReadTimeout

使用SSL时如何在Indy中设置ConnectTimeout / ReadTimeout?

MCVE:

program mcve;

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}SysUtils, IdHTTP, IdSSLOpenSSL, DateUtils;

var
  HTTP    : TIdHTTP;
  SSL     : TIdSSLIOHandlerSocketOpenSSL;
  Started : TDateTime;
begin
  HTTP := TIdHTTP.Create();
  try
    HTTP.ReadTimeout            := 1000;
    HTTP.ConnectTimeout         := 2000;
    SSL                         := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
    SSL.ConnectTimeout          := HTTP.ConnectTimeout;
    SSL.ReadTimeout             := HTTP.ReadTimeout;
    SSL.SSLOptions.SSLVersions  := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
    HTTP.IOHandler              := SSL;
    Started := Now;
    try
      HTTP.Get(ParamStr(1));
    except
      On E: Exception do WriteLn(E.Message);
    end;
    Writeln(FormatDateTime('hh:nn:ss', SecondsBetween(Started, Now) / SecsPerDay));
  finally
    HTTP.Free;
  end;
end.
Run Code Online (Sandbox Code Playgroud)

使用httpConnectTimeout / ReadTimeout时,只有在使用时,此问题才能解决https …

delphi freepascal indy lazarus

4
推荐指数
1
解决办法
118
查看次数

Delphi - 获取文件夹图标

我怎么能得到特殊文件夹的图标,例如 Desktop

function GetFolderIcon( FName: string ): integer;
var
  FInfo: TSHFileInfo;
begin
  if SHGetFileInfo(pChar(FName), FILE_ATTRIBUTE_NORMAL, FInfo, SizeOf(FInfo),
     SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_USEFILEATTRIBUTES or SHGFI_PIDL or SHGFI_ICON or SHGFI_OPENICON ) <> 0 then begin
        Result := FInfo.iIcon
    end
  else
    Result := -1;
end;
Run Code Online (Sandbox Code Playgroud)

GetFolderIcon(GetSpecialFolder(CSIDL_DESKTOP)); retern -1

delphi winapi

3
推荐指数
1
解决办法
860
查看次数

WinAPI Unicode和ANSI函数

大多数WinAPI的电话都UnicodeANSI函数调用

例如:

function MessageBoxA(hWnd: HWND; lpText, lpCaption: LPCSTR; uType: UINT): Integer; stdcall;external user32;

function MessageBoxW(hWnd: HWND; lpText, lpCaption: LPCWSTR; uType: UINT): Integer; stdcall; external user32;
Run Code Online (Sandbox Code Playgroud)

我何时应该使用ANSI函数而不是调用Unicode函数?

windows unicode winapi function ansi

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

在图像上绘制文本

我正在尝试使用以下代码在图像上绘制文本:

procedure TfMain.TextToImage(const AText: string; const AImage: TImage);
begin
  if NOT Assigned(AImage) then Exit;    
  AImage.Canvas.BeginScene;
  AImage.Canvas.Font.Size    := 18;
  AImage.Canvas.Font.Family  := 'Arial';
  AImage.Canvas.Fill.Color   := TAlphaColorRec.Dodgerblue;
  AImage.Canvas.Font.Style   := [TFontStyle.fsbold];
  AImage.Canvas.FillText( AImage.AbsoluteRect,
                          AText,
                          False,
                          1,
                          [TFillTextFlag.RightToLeft],
                          TTextAlign.taCenter,
                          TTextAlign.taCenter);
  AImage.Canvas.EndScene;
end;
Run Code Online (Sandbox Code Playgroud)

问:为什么上面的步骤在 Windows 上可以运行,但在 Android 上却不行?

delphi android firemonkey delphi-10-seattle

3
推荐指数
1
解决办法
1898
查看次数

TTask比TThread慢

我有两种多线程代码执行相同工作的方法.

TTask:

const
  MaxThreadCount = 80;

procedure TWorkerTask.Update;
var
  aTasks  : array of ITask;
  I: Integer;
begin
  Stopwatch := TStopwatch.StartNew;
  SetLength(aTasks, MaxThreadCount);
  for I := Low(aTasks) to High(aTasks) do begin
    aTasks[I] := TTask.Create( procedure
    begin
      Writeln('Thread ', TTask.CurrentTask.Id, ' Stared');
      Sleep(5000);
      Writeln('Thread ', TTask.CurrentTask.Id, ' Finshed');
    end);
    aTasks[I].Start;
  end;
  TTask.WaitForAll(aTasks);
  Elapsed := Stopwatch.Elapsed;
  Writeln('Done in ', Round(Elapsed.TotalSeconds));
end;
Run Code Online (Sandbox Code Playgroud)

输出例如 Done in 29

TThread类:

const
  MaxThreadCount = 80;

procedure TWorker.Execute;
begin
  Writeln('Thread ', ThreadID, ' Stared');
  Sleep(5000);
  Writeln('Thread ', ThreadID, ' …
Run Code Online (Sandbox Code Playgroud)

delphi multithreading delphi-10.2-tokyo

3
推荐指数
1
解决办法
654
查看次数

delphi - 调用外部WinAPI函数

我正在尝试调用IsNativeVhdBoot函数,但我收到错误消息The parameter is incorrect.

function IsNativeVhdBoot(var NativeVhdBoot:PBOOL):BOOL; external Kernel32 name 'IsNativeVhdBoot';

function _IsNativeVhdBoot:Boolean;
var
  pB:PBOOL;
begin
  Result := False;
  if IsNativeVhdBoot(pB) then
    Result := pB^
  else RaiseLastOSError;
end;
Run Code Online (Sandbox Code Playgroud)

我也试过这样称呼它

function __IsNativeVhdBoot: Boolean;
type
  TIsNativeVhdBoot = function(
    var NativeVhdBoot: pBOOL
  ): BOOL; stdcall;
var
  bNativeVhdBoot: pBOOL;
  NativeVhdBoot : TIsNativeVhdBoot;
begin
  Result := False;
  NativeVhdBoot := GetProcAddress(GetModuleHandle(kernel32), 'IsNativeVhdBoot');
  if (@NativeVhdBoot <> nil) then
  begin
    if not NativeVhdBoot(bNativeVhdBoot) then
      RaiseLastOSError;
    Result := bNativeVhdBoot^;
  end
  else
    RaiseLastOSError;
end;
Run Code Online (Sandbox Code Playgroud)

我的问题是

  1. 调用上述函数我做错了什么.
  2. 在delphi中调用extranl …

c++ delphi winapi windows-10

2
推荐指数
1
解决办法
587
查看次数

IdHTTP如何发送原始身体

如何使用以下IdHTTP方式发送消息PostMan:

头 身体

我的第一次尝试如下:

function TIdFoo.SendIM(const AID, AMessage: string): Boolean;
const
  _URL = 'https://URL.com/SendMessage';
var
  Params   : TStringStream;
  Response : string;
  LMsg     : string;
begin
  Result := False;
  LMsg := '-----------------------------13932'+
          'Content-Type: application/json; charset=utf-8'+
          'Content-Description: message'+ sLineBreak+          '{"message":{"Type":1,"body":"'+AMessage+'"},"to":["'+AID+'"]}'+
          '-----------------------------13932--;'+sLineBreak;
  Params := TStringStream.Create(LMsg, TEncoding.UTF8);
  try
    IdHTTP.Request.CustomHeaders.AddValue('authorization', 'Bearer ' + FToken);
    IdHTTP.Request.CustomHeaders.AddValue('Origin', 'https://www.URL.com');
    IdHTTP.Request.UserAgent      := 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36';
    IdHTTP.Request.Accept         := '*/*';
    IdHTTP.Request.Referer        := 'https://www.URL.com/en-us/';
    IdHTTP.Request.Host           := 'URL.com';
    IdHTTP.Request.AcceptEncoding := 'gzip, deflate, br';
    IdHTTP.Request.AcceptLanguage …
Run Code Online (Sandbox Code Playgroud)

delphi http indy idhttp

2
推荐指数
1
解决办法
2705
查看次数