在以下代码中调用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)
我工作TStringList有TMemeorySteam很多在我的项目.
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编码.
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) 使用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 …
我怎么能得到特殊文件夹的图标,例如 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
大多数WinAPI的电话都Unicode和ANSI函数调用
例如:
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函数?
我正在尝试使用以下代码在图像上绘制文本:
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 上却不行?
我有两种多线程代码执行相同工作的方法.
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) 我正在尝试调用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)
我的问题是
如何使用以下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)