2022年5月5日 星期四

IDL2PAS MIDL tools tlibimp Microsoft IDL

 https://www.drbob42.com/examines/home.htm

https://stackoverflow.com/questions/5091829/idl-to-type-library 

https://docs.microsoft.com/zh-tw/troubleshoot/windows-client/deployment/dynamic-link-library

https://stackoverflow.com/questions/7994852/consume-net-assembly-in-delphi-xe2/8013047#8013047

https://stackoverflow.com/questions/8431313/how-to-fix-this-unmanaged-exports-trouble-using-delphi-c

https://www.delphipower.xyz/guide_6/using_delphi_or_idl_syntax.html

delphi idl dll predeclid predeclid typeinfo except propput propputref members except CoClass public alias typeinfo

https://docwiki.embarcadero.com/RADStudio/Sydney/en/Using_Delphi_or_RIDL_Syntax

Delphi  Developers Guide Interface Definition Language idl

COM, COM+, Delphi Tutorials and References - Binh Ly


https://en.wikipedia.org/wiki/Microsoft_Interface_Definition_Language

DLL OAIDL.IDL OBJIDL.IDL  tlb TypeLib

https://docs.microsoft.com/zh-tw/windows/win32/com/anatomy-of-an-idl-file

https://github.com/ojdkbuild/tools_toolchain_sdk71/blob/master/Include/PropIdl.Idl




1.【How To Do COM In C  Builder 5】----Interface Definition Language (IDL)
http://www.blong.com/Conferences/IConUK2000/C  COM/COM In C  Builder.htm#IDL     2.【C  Builder Unleashed】----Chapter 27: C  Builder, OLE Automation, and Distributed COM
http://www.tietovayla.fi/BORLAND/CPLUS/bcppbuilder/4/books/cppbu/chapter27/    3.ActiveX and the VCL (part 1)----Introducing the wizards
http://community.borland.com/article/0,1410,20669,00.html    4.ActiveX and the VCL (part 2) ---Connecting to ActiveX Servers
http://community.borland.com/article/0,1410,20677,00.html    5.MIDL Command-Line Reference
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/midl/midl/general_midl_command_line_syntax.asp    6. Microsoft Interface Definition Language (MIDL) Reference
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/midl/midl/general_midl_command_line_syntax.asp
Microsoft Interface Definition Language (MIDL)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/midl/midl/general_midl_command_line_syntax.asp   

2022年5月4日 星期三

Instructions and precautions for calling JNI jar Java in Delphi cross platform development Android

 https://cdmana.com/2022/03/202203200608160695.html

 https://synaptica.info/en/2017/03/07/delphi-fmx-android-app-to-check-mem-usage/

 Android, how to call a TJIntent 

 

https://en.delphipraxis.net/topic/1361-android-how-to-call-a-tjintent/ 

 

  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls, Androidapi.JNI.App
  ,Androidapi.JNIBridge
  ,Androidapi.JNI.GraphicsContentViewText
  ,Androidapi.JNI.JavaTypes
  ,Androidapi.JNI.Os
  ,FMX.Helpers.Android
  ,Androidapi.Helpers
  ,Androidapi.JNI.ActivityManager;


TAndroidHelper


https://docwiki.embarcadero.com/CodeExamples/Alexandria/en/FMX.Android_Intents_Sample


http://aziga.x10.mx/delphi/index.php?option=com_content&view=article&id=28&Itemid=33

https://blogs.embarcadero.com/adopting-the-openjdk-for-delphi-android-development/


delphi java code android  Translation

https://github.com/tothpaul/APKPascal


https://github.com/chinawsb/QSDK

https://docwiki.embarcadero.com/RADStudio/Sydney/en/Using_a_Custom_Set_of_Java_Libraries_In_Your_RAD_Studio_Android_Apps

Developing Fluent User Interfaces for Windows 10

 The ribbon component of the Microsoft Office Fluent  interface  users Office applications.

 https://github.com/fluentribbon/Fluent.Ribbon

 
Developing Fluent User Interfaces for Windows 10 https://youtu.be/uOpbLLDh1hc

https://en.wikipedia.org/wiki/Fluent_interface

 Microsoft Office 2007 § User interface
https://www.microsoft.com/design/fluent/#/

https://github.com/sourcechord/FluentWPF

https://www.dima.to/blog/how-to-host-wpf-controls-in-a-delphi-application-and-delphi-controls-in-a-wpf-application/

https://code.google.com/archive/p/delphihtmlwriter/

https://www.thedelphigeek.com/2009/04/fluent-xml-1.html

https://docwiki.embarcadero.com/RADStudio/Alexandria/en/Program_Control_(Delphi)

https://github.com/mremec/omnixml

https://github.com/VSoftTechnologies/Delphi-Fluent-XML/blob/master/README.md

https://blogs.embarcadero.com/es/giving-your-apps-the-fluent-ui-look-and-feel-with-delphi/

https://blog.marcocantu.com/blog/fluent_delphi.html

https://www.andrecelestino.com/fluent-interface-no-delphi/

https://github.com/NickHodges/delphihtmlwriter

https://blogs.embarcadero.com/delphi-offers-deeper-third-party-tool-api-integration-than-wpf-and-electron/

 

 

 

 https://docs.microsoft.com/en-us/dotnet/desktop/wpf/advanced/wpf-and-win32-interoperation?view=netframeworkdesktop-4.8

WPF and Win32 Interoperation
This topic provides an overview of how to interoperate WPF and Win32 code. Windows Presentation Foundation (WPF) provides a rich environment for creating applications. However, when you have a substantial investment in Win32 code, it might be more effective to reuse some of that code.
WPF and Win32 Interoperation Basics

Delphi runtime

 https://blogs.embarcadero.com/coming-delphi-10-4-runtime-library-enhancements/

 https://github.com/salvadordf/WebView4Delphi

https://github.com/jchv/OpenWebView2Loader

DRT

A better Delphi runtime.
https://gitee.com/YWtheGod/DRT


Combine with librarys in C code. Now contains:

    Zlib 1.2.12 from https://github.com/jtkukunas/zlib

    XXHASH 0.8.1 from https://github.com/Cyan4973/xxHash

    LZ4 from https://github.com/lz4/lz4

    zstd from https://github.com/facebook/zstd

    fastmm5 from https://github.com/pleriche/FastMM5 (used in windows platforms)

    mimalloc from https://github.com/microsoft/mimalloc (used in non windows platforms)

    Update 2022/05/02: Add FastMM5(for Windows) and mimalloc(for other platforms), and Patch move function to use MSVCRT's memmove implement(Windows only, other platforms already use CRT's memmove)

    Update 2022/04/24: Add WebView2Loader Support for FMX Edge, no more DLL needed for FMX Win App. and Add a lot WebView2 Related Units from https://github.com/salvadordf/WebView4Delphi

    Update 2022/04/23: Add WebView2Loader PASCAL implementation, so no more WebView2Loader.DLL needed. Translated from https://github.com/jchv/OpenWebView2Loader

2022年5月2日 星期一

Developer Tools Debug Tools Memory Leaks Delphi High Performance Profiler and Memory Analysis Tools for Delphi


 GpProfile   
 MemProof  
 AsmProfiler   
 Sampling Profiler   
 ProDelphi   
 AQTime   
 SmartInspect 

https://torry.net/pages.php?id=1526

TStopWatch TTimeSpan QueryPerformanceCounter GetTickCount GetTickCount64

 https://docwiki.embarcadero.com/Libraries/Sydney/en/System.Diagnostics.TStopwatch

2022年5月1日 星期日

Parallel Redundancy IEC 61850 HMI SCADA Protection

 https://www.researchgate.net/publication/269309732_Protection_and_control_system_upgrade_based_on_IEC-_61850_and_PRP

 

 Protection and control system upgrade based on IEC- 61850 and PRP

Canelé de bordeaux 卡納蕾 canelé canelé de Bordeaux 可麗露 可露麗


https://zh.wikipedia.org/wiki/%E5%8D%A1%E7%B4%8D%E8%95%BE
https://en.wikipedia.org/wiki/Canel%C3%A9
Makes 12 servings
2 cups (500ml) milk
2 tbsp (30g) butter
1 cup (200g) caster sugar
1 cup (125g) bread flour
2 egg yolks +1 whole egg
1/2 tsp (3g) salt
1 tsp (5g) vanilla extract
1 tsp (5g) rum extract
1/4 cup (60ml) rum


https://youtu.be/tHe7rxHgflk
Canelés (Cannelés) de Bordeaux


Home Cooking Adventure
https://www.youtube.com/results?search_query=Canel%C3%A9+aux+Noisettines
http://www.37cooks.com/2016/10/orange-canele-de-bordeaux.html
 

Caneles Experiment: No Beeswax, No Copper Mold, No 48hr Resting!

https://youtu.be/hQB9GYihmd8

https://en.wikipedia.org/wiki/Madeleine_(cake)

https://en.wikipedia.org/wiki/Muffin

https://www.bonnemaman.co.uk/

2022年4月30日 星期六

Algorithms

 https://www.geeksforgeeks.org/fundamentals-of-algorithms/?ref=lbp

2022年4月29日 星期五

Delphi IDE Tools and Plug-Ins

 Delphi IDE Tools and Plug-Ins
 
Delphi IDE - Integrated Development Eenvironment provides all the tools you need to design, develop, test, debug, and deploy applications, allowing rapid prototyping and a shorter development time. Want more? Here's how to add more functionality to Delphi IDE and make your job easier.
• GExperts
GExperts is a free set of tools built to increase the productivity of Delphi and C++Builder programmers by adding several features to the IDE. GExperts is developed as Open Source software.  More »
• ModelMaker Code Explorer
ModelMaker Code Explorer is a Class Explorer and Refactoring Browser fro Delphi IDE. More »
• Delphi SpeedUp
DelphiSpeedUp is an IDE plugin for Delphi and C++Builder. It improves the IDE’s startup speed and increases the general speed of the whole IDE. This is achieved by replacing some often used RTL functions by FastCode function that are optimized for the used CPU and some other faster implementations. It also employs caches when the IDE loads.  More »
• CnPack IDE Wizards
CnWizards includes the following experts/wizards: Code Input Helper, Enhanced Units/Forms List, Project Extension Tools, Roll Windows and Set to Topmost, Source Codes Statistics, DFM File Convertor, DE Config Backup/Restore Tool, including IDE History Cleaner, ...  More »
• Brilliant Code for Delphi
Automatically search and filling variables, methods, constants, types in selected color, Highlight structures begin .. end, try .. finally .. end and other, Highlight brackets (..) and [..], Error correction offset lines for debugging, ...  More »
• Visual Forms
Visual Forms is a thumbnail viewer for the forms in your project.  More »
• Pascal Analyzer
This program parses Delphi source code and produces reports that help you understand your source code better. You will also be able to identify potential errors and anomalies. Your code will be more readable and maintainable. Pascal Analyzer can also check how coding standard guidelines are followed.  More »
• VssConneXion
VssConneXion provides an integration between CodeGear RAD Studio, Delphi and C++Builder and Visual SourceSafe.  More »
• Castalia for Delphi
Castalia transforms the Delphi programming environment into an amazing development platform. Castalia lives on the bleeding edge of IDE technology, giving you cutting edge tools to write better code faster, understand code more accurately, and improve code you've already written.  More »

ㄅㄅㄅl496456404

 l496456404ㄅㄅㄅl496456404

low temperature Ceramic material spring ceramic spring elasticity Preparation composite ceramic sponges PDMS Sponges

 low temperature Ceramic material spring ceramic spring elasticity Preparation composite ceramic sponges PDMS Sponges

https://www.nature.com/articles/s41467-020-17533-6 

Ajay Giri Prakash Kottapalli PDMS MLG PDMS spongy  Ultralightweight and 3D Squeezable

2022年4月28日 星期四

delphi TFile Stream binary file reader embarcadero

 https://docwiki.embarcadero.com/RADStudio/Alexandria/en/Streams,_Reader_and_Writers

Streams, Reader and Writers - RAD Studio - Embarcadero ...
https://docwiki.embarcadero.com › Strea...
 
This topic lists all stream, reader and writer classes. ... TFileStream enables applications to read from and write to a file on disk. System.Classes.


    Using Streams to Read or Write Data - RAD Studio
    https://docwiki.embarcadero.com › Sydney

 
Stream classes all share several methods for reading and writing data. ... Read is useful when the number of bytes in the file is not known.

Using File Streams - RAD Studio - Embarcadero DocWiki
https://docwiki.embarcadero.com › Sydney
 
Creating and opening files using file streams — The TFileStream class enables applications to read from and write to a file on disk. Because ...

System.IOUtils.TFile.ReadAllBytes - Embarcadero DocWiki
https://docwiki.embarcadero.com › Syste...
 
Reads the contents of the file into a byte array. Use ReadAllBytes to read the contents of a binary file. ReadAllBytes returns a new byte array containing ...

Opening Binary File w/ TFileStream - delphi
http://www.delphigroups.info › delphi
 
 Opening Binary File w/ TFileStream. I'd like some tips on how to go about opening certain types of data files, which I guess would be binary ...
  embarcadero  embarcadero


https://docwiki.embarcadero.com/RADStudio/Sydney/en/Using_the_Eof_and_Bof_Properties

http://www.pjh2.de/delphi/articles/files/files.php

Dateizugriffe
Inhaltsverzeichnis:

Einführung
TextFile / Read
File / BlockRead
TFileStream
TFileStream / TReader


template book front cover title subtitle publisher translator author summary blurb table of contents chapter appendix glossary index reference


 

https://tex.stackexchange.com/questions/573047/how-to-format-bibliography-in-table-of-contents-as-part-instead-of-chapter-with

 https://en.wikipedia.org/wiki/Book_design

https://www.iuniverse.com/en/resources/publishing/parts-of-your-book

2022年4月26日 星期二

如何使用 Win32 API 存取 RS232

 http://www.finetech.idv.tw/techdoc/bcbrs232/bcbrs232.htm

 https://stackoverflow.com/questions/820817/low-level-control-of-rs232-com-port-rts-cts-dtr-dsr-possible

Win32 API Communication Functions  

BOOL SetCommState(
    HANDLE hFile,    // handle of communications device
    LPDCB lpDCB            // address of device-control block structure
   );

 
    Windows App Win32 API System Services Winbase.h

SetCommState function (winbase.h)

 
http://delphi-kb.blogspot.com/2009/03/how-to-communicate-with-com-port.html
https://docs.microsoft.com/zh-tw/windows/win32/api/winbase/nf-winbase-setcommstate 


unit ComPort;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TComPort = class(TObject)
  private
    ComID, ComError: Integer;
    DcbOld: TDCB;
    CommTimeoutsOld: TCommTimeouts;
  protected
  public
    function Open(PortNo: integer): boolean;
    procedure Close;
    function Config(Baudrate: DWORD; ByteSize, StopBits, Parity: Byte): boolean;
    function ReadBlock(var Ch: array of char; BlockSize: dword): integer;
    function ReadChar(var Ch: char): boolean;
    function WriteBlock(var Ch: array of char; BlockSize: dword): boolean;
    function WriteChar(Ch: char): boolean;
    procedure Purge;
    function Error: integer;
    constructor Create;
  published
  end;



https://docs.microsoft.com/en-us/previous-versions/ms810467(v=msdn.10)?redirectedfrom=MSDN

Serial Communications in Win32
multiple threading and synchronization in Win32. In addition, a basic understanding of the Win32 heap functions is useful to fully comprehend the memory management methods used by the Multithreaded TTY (MTTTY) 

spcomm mscomm Tcomm Cport CnRS232 MScom SPCOM

Delphi串口通信技术与工程实践

 

https://github.com/MHumm/ComPortDriver

https://github.com/CWBudde/ComPort-Library

https://github.com/joelsernamoreno/WSD/blob/master/tools/nodemcu-flasher-master/SPComm.pas

https://torry.net/pages.php?id=198

http://www.tetraedre.com/advanced/serial/msdn_serial.htm

powershell "$port= new-Object System.IO.Ports.SerialPort

https://theitbros.com/how-to-delete-com-ports-in-use/

Docs Windows Server Windows 命令 參考
mode
顯示 [系統狀態]、[變更系統設定] 或 [重新設定埠] 或 [裝置]。 如果使用時不含參數,則 模式 會顯示主控台和可用 COM 裝置的所有可控制屬性。

https://docs.microsoft.com/zh-tw/windows-server/administration/windows-commands/mode

DLL "LoadLibrary " +"delphi" import dll Libraries and Packages Delphi

 "LoadLibrary "  +"delphi"   import dll Libraries and Packages Delphi

 Dr.Bob's Delphi Clinic: Using C DLLs with Delphi (and HeadConv v4.20)

 https://www.drbob42.com/Delphi/headconv.htm

 http://www.drbob42.com/tools/drbob.htm

 Dr.Bob's SwarTools: Dr.Bob's Collection of Delphi Experts/Wizards v2.50

 https://infosys.beckhoff.com/english.php?content=../content/1033/tcsample_bdelphi/html/TcAdsOcx_Setup_Delphi.htm&id=

 https://www.mql5.com/en/articles/96

https://blogs.embarcadero.com/how-to-use-a-c-dll-in-any-delphi-program/

 http://etutorials.org/Programming/mastering+delphi+7/Part+II+Delphi+Object-Oriented+Architectures/Chapter+10+Libraries+and+Packages/Creating+a+DLL+in+Delphi/

 https://github.com/PacktPublishing/Delphi-High-Performance/tree/master/Chapter%208

 http://etutorials.org/Programming/mastering+delphi+7/Part+II+Delphi+Object-Oriented+Architectures/Chapter+10+Libraries+and+Packages/Using+Existing+DLLs/

http://theprofessionalspoint.blogspot.com/2014/01/calling-conventions-in-delphi-safecall.html

 https://docwiki.embarcadero.com/RADStudio/Sydney/en/Program_Control_(Delphi)

Delphi DLL function stdcall external

COM Component Object Model  

COM+ 

DCOM Distributed Component Object Model

 https://stackoverflow.com/questions/17937225/delphi-how-to-import-type-library-for-new-itextrange2-type-interfaces

 tlibimp Embarcadero Type Library Exporter

 RegAsm

https://blogs.embarcadero.com/using-a-net-assembly-via-com-in-delphi/ 

 DLL external COM Component Object Model  interface

https://docwiki.embarcadero.com/RADStudio/Sydney/en/Overview_of_COM_Technologies

Using Visual C++ DLLs in a C++Builder Project

https://blogs.embarcadero.com/use-the-dll-created-by-visual-c-2017-with-c-builder-win64/

https://www.marshallsoft.com/wsc_4c.pdf

Windows Standard Serial Communications for C/C++ ...

https://github.com/sefcom/honeyplc/blob/master/snap7/doc/Snap7-refman.pdf

https://github.com/sefcom/honeyplc

https://sourceforge.net/projects/libusb-win32/

embarcadero import tools  DLL external COM Component Object Model Importing Type Library Information

https://www.c-sharpcorner.com/UploadFile/nipuntomar/describing-com-component-object-model/

Component Object Model Importing Type Library Information guid interface

 CoCreateInstance IDispatch IUnknow

The following is a list of tips and tricks that might be useful to COM developers of all levels. If you have an interesting tip that's not listed here, please submit it to me and I'll add it to the list if I think it's useful.

http://www.techvanguards.com/com/tutorials/tips.asp

https://www.codeproject.com/Questions/373094/In-the-c-plus-plus-to-Delphi

GPIB-488

 This is one-purpose program created for management of experiment on custom  aparatus. His goal take measurements of values for computation if Seebeck  coefficient

 https://github.com/pinkavaj/seebrez/blob/master/GPIB-488/Language%20Interfaces/Delphi/GPIB.PAS

 seebrez/GPIB-488/Language Interfaces/Delphi/

 https://www.ni.com/zh-tw/support/downloads/drivers/download.ni-488-2.html#442610

  NI-488.2 with LabVIEW

 

 

 

 

 

 

 

 

https://github.com/pinkavaj/seebrez/tree/master/TPCM.

Base64 Image System.NetEncoding.TBase64Encoding

https://github.com/emn178/hi-base64

 https://github.com/whatwg/wattsi/blob/main/src/lib/base64encoder.pas

 https://docwiki.embarcadero.com/Libraries/Sydney/en/System.NetEncoding.TBase64Encoding

unction BaseImage(fn: string): string;
var
    m1: TMemoryStream;
    m2: TStringStream;
    str: string;
begin
    m1 := TMemoryStream.Create;
    m2 := TStringStream.Create('');
    m1.LoadFromFile(fn);
    EncdDecd.EncodeStream(m1, m2);                       
    str := m2.DataString;
    str := StringReplace(str, #13, '', [rfReplaceAll]); 
    str := StringReplace(str, #10, '', [rfReplaceAll]);
    result := str;                                      
    m1.Free;
    m2.Free;
end;

 https://flixengineering.com/archives/270

 http://www.delphimagazine.com/2019/05/21/5-minute-snack-base64-encode-and-decode-images-in-delphi/

  1. procedure TFrmMain.btnLoadImageClick(Sender: TObject);
  2. var
  3. LInput : TMemoryStream;
  4. LOutput: TMemoryStream;
  5. begin
  6. // show open file dialog
  7. if
  8. dlgOpen.Execute then
  9. begin
  10. // load image into image component (TPicture)

  11. Image.Picture.LoadFromFile(dlgOpen.FileName);
  12. LInput := TMemoryStream.Create;
  13. LOutput := TMemoryStream.Create;

  14. // write picture to stream and encode
  15. try
  16. Image.Picture.SaveToStream(LInput);
  17. LInput.Position := 0;
  18. TNetEncoding.Base64.Encode( LInput, LOutput );
  19. LOutput.Position := 0;
  20. Memo.Lines.LoadFromStream( LOutput );
  21. finally
  22. LInput.Free;
  23. LOutput.Free;
  24. end;
  25. end;
  26. end;
  27.  

 

  1. procedure TFrmMain.btnLoadTextClick(Sender: TObject);
  2. var
  3. LInput: TMemoryStream;
  4. LOutput: TMemoryStream;
  5. begin
  6. if dlgOpen.Execute then
  7. begin
  8. Memo.Lines.LoadFromFile(dlgOpen.FileName);
  9. LInput := TMemoryStream.Create;
  10. LOutput := TMemoryStream.Create;

  11. try
  12. Memo.Lines.SaveToStream(LInput);
  13. LInput.Position := 0;
  14. TNetEncoding.Base64.Decode( LInput, LOutput );
  15. LOutput.Position := 0;
  16. Image.Picture.LoadFromStream(LOutput);
  17. finally
  18. LInput.Free;
  19. LOutput.Free;
  20. end;
  21. end;
  22. end;

unit uPublicSHA256WithRsa;

interface

uses Winapi.Windows,System.Classes, System.SysUtils,libeay32,ComObj;


const
  BIO_FLAGS_BASE64_NO_NL = $100;

type
  TSHA1Buffer = array [1..20] of byte;
  TSHA256Buffer= array[1..32] of Byte;
  TRSA_Buf_1024 = array[1..128] of byte; //1024bit RSA 樓躇怀堤
  TRSA_Buf_2048 = array[1..256] of byte; //2048bit RSA 樓躇怀堤

  TAES_Key_128 = array[1..16] of byte;

  TMD5_Digest = array[1..16] of byte;//md5 靡賦彆

  THA256_Digest = array[1..16] of byte; //SHA256 靡賦彆


  PsfAES_CBC_Data=^TsfAES_CBC_Data;
  TsfAES_CBC_Data = record
    InBuf:Pointer;
    InLen:Integer;
    Key:TAES_Key_128;
    ivec:TAES_Key_128;
  end;

  psfRSA = ^libeay32.RSA;

  TSHA256WithRSAOpenSSL=class
  protected
    FstrPublicKey:AnsiString;
    FstrPrivateKey:AnsiString;
  protected
   
    function base64_decode(Data:PAnsiChar;DataLen:Cardinal;bSingleRow:Boolean=FALSE):AnsiString;
 
    function base64_encode(Data:Pointer;Len:Integer;bSingleRow:Boolean=FALSE):AnsiString;

    function LoadPublicKey(PUBLIC_Key:AnsiString):pEVP_PKEY;
    function LoadPrivateKey(PRIVATE_Key:AnsiString):pEVP_PKEY;
  public
    function SHA256WithRSASign(const TextBuf:PAnsiChar;BufLen:Integer):AnsiString;
    function SHA256WithRSASign_verify(Data:PAnsichar;RsaSign:PAnsichar):Boolean;

    constructor Create(PUBLIC_Key,PRIVATE_Key:AnsiString);
    destructor Destroy; override;
  end;


implementation

uses
  uLogThread;

{ TSHA256WithRSAOpenSSL }

function TSHA256WithRSAOpenSSL.base64_decode(Data: PAnsiChar; DataLen: Cardinal;
  bSingleRow: Boolean): AnsiString;
var
  BIO,b64:PBIO;
  L:Integer;
begin
  b64 := Libeay32.BIO_new(BIO_f_base64());
  if bSingleRow then
    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
  bio := Libeay32.BIO_new_mem_buf(Data,DataLen);
  bio := Libeay32.BIO_push(b64, bio);
  SetLength(Result,DataLen);
  L := Libeay32.BIO_read(bio,PAnsichar(Result),Length(Result));
  SetLength(Result,L);
  Libeay32.BIO_free_all(bio);

end;

function TSHA256WithRSAOpenSSL.base64_encode(Data: Pointer; Len: Integer;
  bSingleRow: Boolean): AnsiString;
var
  bio,b64:libeay32.pBIO;
  bptr: libeay32.PBUF_MEM ;
  pbptr:libeay32.PPBUF_MEM;
  I:Integer;
begin
  b64 := libeay32.BIO_new(BIO_f_base64());
  TRY
    if bSingleRow then
    begin
      libeay32.BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
    end;

    bio := libeay32.BIO_new(BIO_s_mem());

    b64 := BIO_push(b64, bio);

    I := libeay32.BIO_write(b64, Data, Len);
    if I < 0 then
      Exit;
    I := libeay32.BIO_flush(b64);

    pbptr := @bptr;
    I := libeay32.BIO_get_mem_ptr(b64, pbptr); //頗蔚BIO_C_GET_BUF_MEM_PTR紱釬換菰跤bio
    if I < 0 then
    begin
      Result := '';
      Exit;
    end;

    SetLength(Result,bPtr^.length);
    Move(bPtr^.data^,Result[1],bPtr^.length);
  FINALLY
    libeay32.BIO_Free_All(b64); //坻頗庋溫淕跺蟈沭
  END;

end;

constructor TSHA256WithRSAOpenSSL.Create(PUBLIC_Key, PRIVATE_Key: AnsiString);
begin
  try
    OpenSSL_add_all_algorithms;
    OpenSSL_add_all_ciphers;
    OpenSSL_add_all_digests;
    ERR_load_crypto_strings;
    ERR_load_RSA_strings;

    FstrPublicKey :=PUBLIC_Key;
    FstrPrivateKey :=PRIVATE_Key;

    if FstrPublicKey='' then
      raise Exception.Create('PublicKey Invalid');

    if FstrPrivateKey='' then
      raise Exception.Create('Privatekey Invalid');
  except
    on e:Exception do
    begin
      aiLog.Info(Format('[TSHA256WithRSAOpenSSL.Create][message=%s]',[e.Message]));
      raise e;
    end;
  end;
end;

destructor TSHA256WithRSAOpenSSL.Destroy;
begin
  try
    EVP_cleanup;
    ERR_free_strings;
    inherited;
  except
    on e:Exception do
    begin
      aiLog.Info(Format('[TSHA256WithRSAOpenSSL.Destroy]',[e.Message]));
      raise e;
    end;
  end;
end;


function TSHA256WithRSAOpenSSL.LoadPrivateKey(
  PRIVATE_Key: AnsiString): pEVP_PKEY;
var
  keyBO : PBIO;
  aRsa:pEVP_PKEY;
  iRet:integer;
begin
  aRsa :=nil;
  keyBO :=nil;

  keyBO := BIO_new_mem_buf(PAnsiChar(PRIVATE_Key),Length(PAnsiChar(PRIVATE_Key)));
  try
    Result := PEM_read_bio_PrivateKey(keyBO,aRsa,nil,nil);
  finally
    BIO_free_all(keyBO);
  end;
end;

function TSHA256WithRSAOpenSSL.LoadPublicKey(PUBLIC_Key: AnsiString): pEVP_PKEY;
var
  keyBO: PBIO;
  aRsa:pEVP_PKEY;
begin

  aRsa :=nil;
  keyBO :=nil;

  keyBO := BIO_new_mem_buf(PAnsiChar(PUBLIC_Key),Length(PAnsiChar(PUBLIC_Key)));
  try
    Result :=PEM_read_bio_PUBKEY(keyBO,aRsa,nil,nil)
  finally
    BIO_free_all(keyBO);
  end;
end;

function TSHA256WithRSAOpenSSL.SHA256WithRSASign(const TextBuf: PAnsiChar;
  BufLen: Integer): AnsiString;
var
  outSHA256: TSHA256Buffer;
  RSA_SignBinValue: TRSA_Buf_2048;
  CTX:EVP_MD_CTX;
  mLen:cardinal;
  SigLen,iRet:Integer;
  priKey:pEVP_PKEY;
begin
  ZeroMemory(@outSHA256,Length(outSHA256));
  ZeroMemory(@RSA_SignBinValue,Length(RSA_SignBinValue));

  priKey :=LoadPrivateKey(FstrPrivateKey);

  if priKey=nil then exit;

  EVP_MD_CTX_init(@CTX);
  try
    EVP_SignInit(@CTX,EVP_sha256());
    EVP_SignUpdate(@CTX,TextBuf,BufLen);
    EVP_DigestFinal(@CTX,@outSHA256,mLen);
    iRet := libeay32.RSA_sign(EVP_sha256()._type,
                                @outSHA256,
                                mLen,
                                @RSA_SignBinValue,
                                @SigLen,
                                priKey.pkey.rsa);

    if iRet > 0 then
      Result := base64_encode(@RSA_SignBinValue,SizeOf(RSA_SignBinValue),TRUE);
  finally
    EVP_PKEY_free(priKey);
    EVP_MD_CTX_cleanup(@CTX);
  end;
end;

function TSHA256WithRSAOpenSSL.SHA256WithRSASign_verify(Data,
  RsaSign: PAnsichar): Boolean;
var
  Sha256Buf:TSHA256Buffer;
  ctx: EVP_MD_CTX;
  RsaBuf: AnsiString;
  mlen: DWORD;
  iRet: Integer;
  pEVPKey:pEVP_PKEY;
begin
  Result :=false;
  pEVPKey :=LoadPublicKey(FstrPublicKey);

  if pEVPKey=nil then Exit;

  RSA_memory_lock(pEVPKey.pkey.rsa);
  libeay32.EVP_MD_CTX_init(@ctx);
  try
    EVP_SignInit(@ctx,EVP_sha256());
    EVP_SignUpdate(@ctx,Data,StrLen(Data));
    EVP_DigestFinal(@ctx,@Sha256Buf,mlen);
    RsaBuf := base64_decode(RsaSign,StrLen(RsaSign),TRUE);
    iRet := RSA_verify(EVP_sha256()._type,@Sha256Buf,SizeOf(Sha256Buf),PAnsichar(RsaBuf),Length(RsaBuf),pEVPKey.pkey.rsa);
    Result := (iRet = 1);
  finally
    EVP_PKEY_free(pEVPKey);
    libeay32.EVP_MD_CTX_cleanup(@ctx);
  end;
end;

end.

2022年4月25日 星期一

delphi +"Recurs" recursive Recurse TTreeView TTreeNode rtti Reconstruct full paths from a TreeView in delphi

 https://tech-story.net/reconstruct-full-paths-from-a-treeview-in-delphi/

https://delphisources.ru/pages/faq/master-delphi-7/content/LiB0053.html

http://www.drbob42.com/uk-bug/hood-01.htm

https://theroadtodelphi.com/2010/10/10/fun-with-delphi-rtti-dump-a-trttitype-definition/

2022年4月24日 星期日

Delphi Vcl.Ribbon Ribbon Controls office style

 https://docwiki.embarcadero.com/RADStudio/Sydney/en/Creating_an_Application_that_Uses_Ribbon_Controls

 https://stackoverflow.com/questions/6327845/creating-ribbon-styled-applications

https://www.add-in-express.com/add-in-delphi/com-addins.php

 https://bilsen.com/windowsribbon/index.shtml

https://github.com/JAM-Software/RibbonFramework 



Delphi  Vcl.ActnMan Vcl.ActnList Vcl.ActnMenus Vcl.ActnCtrls

https://docwiki.embarcadero.com/RADStudio/Sydney/en/Handling_VCL_Actions_Using_an_Action_List

https://github.com/orwah/Arabic-Delphi-VCL-Units

https://docwiki.embarcadero.com/Libraries/Sydney/en/Vcl.ActnMan