WPP4Delphi icon indicating copy to clipboard operation
WPP4Delphi copied to clipboard

Demo project and OnGetQrCode parameters issues

Open mbnoimi opened this issue 1 year ago • 33 comments

Hi,

I'm building my first basic example but I couldn't figure out the correct parameters of OnGetQrCode. I tried to use:

procedure(Sender: TObject; const QrCode: string; AImage: TBitmap)

but didn't work. May you please help me to fix it?

unit MaintForm;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls,
  uTWPPConnect;

type
  TMainForm = class(TForm)
    btnSendMessage: TButton;
    edtPhoneNumber: TEdit;
    memoMessage: TMemo;
    lblStatus: TLabel;
    imgQrCode: TImage;
    procedure btnSendMessageClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    WPP: uTWPPConnect.TWPPConnect;
    procedure UpdateStatus(Status: string);
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.FormCreate(Sender: TObject);
begin
  {$IFDEF CEFCurrentVersion}
  ShowMessage('CEFCurrentVersion is defined');
  {$ELSE}
  ShowMessage('CEFCurrentVersion is not defined');
  {$ENDIF}

  WPP := uTWPPConnect.TWPPConnect.Create(Self);

  //-----> [dcc32 Error] MaintForm.pas(48): E2009 Incompatible types: 'Parameter lists differ'
  WPP.OnGetQrCode := procedure(Sender: TObject; const QrCode: string; AImage: TBitmap)
  begin
    imgQrCode.Picture.Assign(AImage);
  end;

  UpdateStatus('Not Connected');
end;

procedure TMainForm.UpdateStatus(Status: string);
begin
  lblStatus.Caption := 'Status: ' + Status;
end;

procedure TMainForm.btnSendMessageClick(Sender: TObject);
var
  TargetNumber, MessageText: string;
begin
  TargetNumber := edtPhoneNumber.Text + '@c.us';
  MessageText := memoMessage.Lines.Text;

  if WPP.Auth(True) then
  begin
    UpdateStatus('Connected');
    WPP.Send(TargetNumber, MessageText);
  end
  else
  begin
    UpdateStatus('Authentication required. Please scan the QR code.');
    ShowMessage('Authentication failed. Please scan the QR code.');
  end;
end;

end.

mbnoimi avatar Aug 13 '24 11:08 mbnoimi

OnGetQrCode is a component event. First you must call the qrcode like this:

if not WPPWhats.Auth(false) then
begin
   WPPWhats.FormQrCodeType := TFormQrCodeType(Ft_None);
   WPPWhats.FormQrCodeStart;
end;

then in the onGetQrCode event the image will be returned:

procedure TFPrincipal2.WPPWhatsGetQrCode(const Sender: TObject; const QrCode: TResultQRCodeClass);
begin
  imgQrCode.BeginUpdate;
  try
    imgQrCode.Bitmap := Base64ToBitmap(StrAfter(QrCode.AQrCode,'base64,'));
    sleep(500);
    imgQrCode.BringToFront;
    imgQrCode.Repaint;
  finally
    imgAguardeQrCode.Visible := imgQrCode.Bitmap.IsEmpty;
    lbAguardeQrCode.Visible  := imgQrCode.Bitmap.IsEmpty;
    AnimaAguardeQrCode.Stop;
    imgQrCode.EndUpdate;
  end;
end;

DjotaHasse avatar Aug 13 '24 13:08 DjotaHasse

OnGetQrCode is a component event. First you must call the qrcode like this:

if not WPPWhats.Auth(false) then
begin
   WPPWhats.FormQrCodeType := TFormQrCodeType(Ft_None);
   WPPWhats.FormQrCodeStart;
end;

then in the onGetQrCode event the image will be returned:

procedure TFPrincipal2.WPPWhatsGetQrCode(const Sender: TObject; const QrCode: TResultQRCodeClass);
begin
  imgQrCode.BeginUpdate;
  try
    imgQrCode.Bitmap := Base64ToBitmap(StrAfter(QrCode.AQrCode,'base64,'));
    sleep(500);
    imgQrCode.BringToFront;
    imgQrCode.Repaint;
  finally
    imgAguardeQrCode.Visible := imgQrCode.Bitmap.IsEmpty;
    lbAguardeQrCode.Visible  := imgQrCode.Bitmap.IsEmpty;
    AnimaAguardeQrCode.Stop;
    imgQrCode.EndUpdate;
  end;
end;

I couldn't understand much from your suggestion because I couldn't install WPP4Delphi design-time components (couldn't find any document for installation steps and Google translate didn't help me much). For that the only option for me is trying to use it completely from the code (couldn't find suitable docs too for a quick start).

If I'm not wrong this suppose to get the benefit of component's event without the need to install it for design time.

  WPP.OnGetQrCode := procedure(Sender: TObject; const QrCode: string; AImage: TBitmap)
  begin
    imgQrCode.Picture.Assign(AImage);
  end;

But number of parameters is absolutely wrong.

So if you please try help me with my very basic example to be able run WPP4Delphi.

BTW, I couldn't run WPP4Delphi demo as well because it uses design-time components

mbnoimi avatar Aug 13 '24 13:08 mbnoimi

@DjotaHasse I modified my code based on your suggestion (without understand it well) but I get these errors:

Checking project dependencies...
Compiling hpcwhatsapp.dproj (Debug, Win32)
dcc32 command line for "hpcwhatsapp.dpr"
  c:\program files (x86)\embarcadero\studio\23.0\bin\dcc32.exe -$O- -$W+ -$R+ -$Q+ --no-config -M -Q -TX.exe 
  -AGenerics.Collections=System.Generics.Collections;Generics.Defaults=System.Generics.Defaults;WinTypes=Winapi.Windows;WinProcs=Winapi.Windows;
  DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE -DDEBUG;CEFCurrentVersion;;FRAMEWORK_VCL -E.\Win32\Debug -I"c:\program files 
  (x86)\embarcadero\studio\23.0\lib\Win32\debug";.\CEF4Delphi;.\CEF4Delphi\source;.\synapse;.\WPP4Delphi;.\WPP4Delphi\Source;.\WPP4Delphi\Source\JS;
  .\WPP4Delphi\Source\Model;.\WPP4Delphi\Source\Other;.\WPP4Delphi\Source\Services;.\WPP4Delphi\Source\View;.\WPP4Delphi\Packages\Compilados;
  .\WPP4Delphi\Packages\Compilados\VD29;"c:\program files (x86)\embarcadero\studio\23.0\lib\Win32\release";
  C:\Users\Administrator\Documents\Embarcadero\Studio\23.0\Imports;C:\Users\Administrator\Documents\Embarcadero\Studio\23.0\Imports\Win32;"c:\program 
  files (x86)\embarcadero\studio\23.0\Imports";C:\Users\Public\Documents\Embarcadero\Studio\23.0\Dcp;"c:\program files 
  (x86)\embarcadero\studio\23.0\include" -LEC:\Users\Public\Documents\Embarcadero\Studio\23.0\Bpl 
  -LNC:\Users\Public\Documents\Embarcadero\Studio\23.0\Dcp -NU.\Win32\Debug -NSWinapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;
  System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell; -O.\CEF4Delphi;.\CEF4Delphi\source;.\synapse;.\WPP4Delphi;
  .\WPP4Delphi\Source;.\WPP4Delphi\Source\JS;.\WPP4Delphi\Source\Model;.\WPP4Delphi\Source\Other;.\WPP4Delphi\Source\Services;.\WPP4Delphi\Source\View;
  .\WPP4Delphi\Packages\Compilados;.\WPP4Delphi\Packages\Compilados\VD29;"c:\program files (x86)\embarcadero\studio\23.0\lib\Win32\release";
  C:\Users\Administrator\Documents\Embarcadero\Studio\23.0\Imports;C:\Users\Administrator\Documents\Embarcadero\Studio\23.0\Imports\Win32;"c:\program 
  files (x86)\embarcadero\studio\23.0\Imports";C:\Users\Public\Documents\Embarcadero\Studio\23.0\Dcp;"c:\program files 
  (x86)\embarcadero\studio\23.0\include" -R.\CEF4Delphi;.\CEF4Delphi\source;.\synapse;.\WPP4Delphi;.\WPP4Delphi\Source;.\WPP4Delphi\Source\JS;
  .\WPP4Delphi\Source\Model;.\WPP4Delphi\Source\Other;.\WPP4Delphi\Source\Services;.\WPP4Delphi\Source\View;.\WPP4Delphi\Packages\Compilados;
  .\WPP4Delphi\Packages\Compilados\VD29;"c:\program files (x86)\embarcadero\studio\23.0\lib\Win32\release";
  C:\Users\Administrator\Documents\Embarcadero\Studio\23.0\Imports;C:\Users\Administrator\Documents\Embarcadero\Studio\23.0\Imports\Win32;"c:\program 
  files (x86)\embarcadero\studio\23.0\Imports";C:\Users\Public\Documents\Embarcadero\Studio\23.0\Dcp;"c:\program files 
  (x86)\embarcadero\studio\23.0\include" -U"c:\program files (x86)\embarcadero\studio\23.0\lib\Win32\debug";.\CEF4Delphi;.\CEF4Delphi\source;.\synapse;
  .\WPP4Delphi;.\WPP4Delphi\Source;.\WPP4Delphi\Source\JS;.\WPP4Delphi\Source\Model;.\WPP4Delphi\Source\Other;.\WPP4Delphi\Source\Services;
  .\WPP4Delphi\Source\View;.\WPP4Delphi\Packages\Compilados;.\WPP4Delphi\Packages\Compilados\VD29;"c:\program files 
  (x86)\embarcadero\studio\23.0\lib\Win32\release";C:\Users\Administrator\Documents\Embarcadero\Studio\23.0\Imports;
  C:\Users\Administrator\Documents\Embarcadero\Studio\23.0\Imports\Win32;"c:\program files (x86)\embarcadero\studio\23.0\Imports";
  C:\Users\Public\Documents\Embarcadero\Studio\23.0\Dcp;"c:\program files (x86)\embarcadero\studio\23.0\include" -V -VN 
  -NBC:\Users\Public\Documents\Embarcadero\Studio\23.0\Dcp -NHC:\Users\Public\Documents\Embarcadero\Studio\23.0\hpp\Win32 -NO.\Win32\Debug  
  hpcwhatsapp.dpr   
[dcc32 Error] MaintForm.pas(58): E2003 Undeclared identifier: 'BeginUpdate'
[dcc32 Error] MaintForm.pas(60): E2003 Undeclared identifier: 'Bitmap'
[dcc32 Error] MaintForm.pas(60): E2003 Undeclared identifier: 'StrAfter'
[dcc32 Error] MaintForm.pas(68): E2003 Undeclared identifier: 'EndUpdate'
[dcc32 Error] MaintForm.pas(70): E2010 Incompatible types: 'TOnGetQrCode' and 'Procedure'
[dcc32 Warning] MaintForm.pas(90): W1000 Symbol 'Send' is deprecated
[dcc32 Fatal Error] hpcwhatsapp.dpr(5): F2063 Could not compile used unit 'MaintForm.pas'
Failed
Elapsed time: 00:00:03.8

This is my modified code:

unit MaintForm;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls,
//   WPP4Delphi units
  uTWPPConnect.ConfigCEF, uTWPPConnect, uTWPPConnect.Constant, uTWPPConnect.JS,
  uWPPConnectDecryptFile, JsonDataObjects,
  uTWPPConnect.Console, uTWPPConnect.Diversos, uTWPPConnect.AdjustNumber,
  uTWPPConnect.Config, uTWPPConnect.Classes,
  uTWPPConnect.Emoticons;

type
  TMainForm = class(TForm)
    btnSendMessage: TButton;
    edtPhoneNumber: TEdit;
    memoMessage: TMemo;
    lblStatus: TLabel;
    imgQrCode: TImage;
    procedure btnSendMessageClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    WPP: uTWPPConnect.TWPPConnect;
    procedure UpdateStatus(Status: string);
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.FormCreate(Sender: TObject);
begin
  {$IFDEF CEFCurrentVersion}
  ShowMessage('CEFCurrentVersion is defined');
  {$ELSE}
  ShowMessage('CEFCurrentVersion is not defined');
  {$ENDIF}

  WPP := uTWPPConnect.TWPPConnect.Create(Self);

  if not WPP.Auth(false) then
  begin
     WPP.FormQrCodeType := TFormQrCodeType(Ft_None);
     WPP.FormQrCodeStart;
  end;

  WPP.OnGetQrCode := procedure(const Sender: TObject; const QrCode: TResultQRCodeClass)
  begin
//    imgQrCode.Picture.Assign(AImage);
    imgQrCode.BeginUpdate;
    try
      imgQrCode.Bitmap := Base64ToBitmap(StrAfter(QrCode.AQrCode,'base64,'));
      sleep(500);
      imgQrCode.BringToFront;
      imgQrCode.Repaint;
    finally
//      imgAguardeQrCode.Visible := imgQrCode.Bitmap.IsEmpty;
//      lbAguardeQrCode.Visible  := imgQrCode.Bitmap.IsEmpty;
//      AnimaAguardeQrCode.Stop;
      imgQrCode.EndUpdate;
    end;
  end;

  UpdateStatus('Not Connected');
end;

procedure TMainForm.UpdateStatus(Status: string);
begin
  lblStatus.Caption := 'Status: ' + Status;
end;

procedure TMainForm.btnSendMessageClick(Sender: TObject);
var
  TargetNumber, MessageText: string;
begin
  TargetNumber := edtPhoneNumber.Text + '@c.us';
  MessageText := memoMessage.Lines.Text;

  if WPP.Auth(True) then
  begin
    UpdateStatus('Connected');
    WPP.Send(TargetNumber, MessageText);
  end
  else
  begin
    UpdateStatus('Authentication required. Please scan the QR code.');
    ShowMessage('Authentication failed. Please scan the QR code.');
  end;
end;

end.

mbnoimi avatar Aug 13 '24 14:08 mbnoimi

I tried something silly too. I implemented Base64ToBitmap manually as I don't know the used unit in your suggestion but this lead to a new runtime error (didn't understand it):

image

unit MaintForm;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls,
  uTWPPConnect.ConfigCEF, uTWPPConnect, uTWPPConnect.Constant, uTWPPConnect.JS,
  uWPPConnectDecryptFile, JsonDataObjects,
  uTWPPConnect.Console, uTWPPConnect.Diversos, uTWPPConnect.AdjustNumber,
  uTWPPConnect.Config, uTWPPConnect.Classes,
  uTWPPConnect.Emoticons, System.NetEncoding;

type
  TMainForm = class(TForm)
    btnSendMessage: TButton;
    edtPhoneNumber: TEdit;
    memoMessage: TMemo;
    lblStatus: TLabel;
    imgQrCode: TImage;
    procedure btnSendMessageClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure WPPGetQrCode(const Sender: TObject; const QrCode: TResultQRCodeClass);
    function Base64ToBitmap(const Base64: string): TBitmap;
  private
    { Private declarations }
    WPP: uTWPPConnect.TWPPConnect;
    procedure UpdateStatus(Status: string);
    function ExtractBase64(const Input: string): string;
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.FormCreate(Sender: TObject);
begin
  {$IFDEF CEFCurrentVersion}
  ShowMessage('CEFCurrentVersion is defined');
  {$ELSE}
  ShowMessage('CEFCurrentVersion is not defined');
  {$ENDIF}
end;

procedure TMainForm.WPPGetQrCode(const Sender: TObject; const QrCode: TResultQRCodeClass);
begin
  imgQrCode.Picture.Bitmap.Canvas.Lock;
  try
    imgQrCode.Picture.Bitmap := Base64ToBitmap(ExtractBase64(QrCode.AQrCode));
    Sleep(500);
    imgQrCode.BringToFront;
    imgQrCode.Repaint;
  finally
    imgQrCode.Picture.Bitmap.Canvas.Unlock;
  end;
end;

function TMainForm.Base64ToBitmap(const Base64: string): TBitmap;
var
  InputStream: TStringStream;
  OutputStream: TMemoryStream;
begin
  Result := TBitmap.Create;
  InputStream := TStringStream.Create(Base64);
  OutputStream := TMemoryStream.Create;
  try
    TNetEncoding.Base64.Decode(InputStream, OutputStream);
    OutputStream.Position := 0;
    Result.LoadFromStream(OutputStream);
  finally
    InputStream.Free;
    OutputStream.Free;
  end;
end;

procedure TMainForm.UpdateStatus(Status: string);
begin
  lblStatus.Caption := 'Status: ' + Status;
end;

procedure TMainForm.btnSendMessageClick(Sender: TObject);
var
  TargetNumber, MessageText: string;
begin
//                             ShowMessage('hi');
 WPP := uTWPPConnect.TWPPConnect.Create(Self);

  if not WPP.Auth(false) then
  begin
    WPP.FormQrCodeType := TFormQrCodeType(Ft_None);
    WPP.FormQrCodeStart;
  end;

  WPP.OnGetQrCode := WPPGetQrCode;

  UpdateStatus('Not Connected');

  TargetNumber := edtPhoneNumber.Text + '@c.us';
  MessageText := memoMessage.Lines.Text;

  if WPP.Auth(True) then
  begin
    UpdateStatus('Connected');
    WPP.Send(TargetNumber, MessageText);
  end
  else
  begin
    UpdateStatus('Authentication required. Please scan the QR code.');
    ShowMessage('Authentication failed. Please scan the QR code.');
  end;
end;

function TMainForm.ExtractBase64(const Input: string): string;
begin
  Result := Copy(Input, Pos('base64,', Input) + 7, Length(Input));
end;

end.

mbnoimi avatar Aug 13 '24 15:08 mbnoimi

In Project >> View Sorce, add:

if not GlobalCEFApp.StartMainProcess then
    Exit;

DjotaHasse avatar Aug 14 '24 11:08 DjotaHasse

In Project >> View Sorce, add:

Where can I find this config?

image

mbnoimi avatar Aug 14 '24 12:08 mbnoimi

It's not inside options, it's Project >> View Source

DjotaHasse avatar Aug 14 '24 12:08 DjotaHasse

Thanks. Got another runtime error message: image

OnGetQrCode to be defined in this procedure! What's wrong?

procedure TMainForm.WPPGetQrCode(const Sender: TObject; const QrCode: TResultQRCodeClass);
begin
  imgQrCode.Picture.Bitmap.Canvas.Lock;
  try
    imgQrCode.Picture.Bitmap := Base64ToBitmap(ExtractBase64(QrCode.AQrCode));
    Sleep(500);
    imgQrCode.BringToFront;
    imgQrCode.Repaint;
  finally
    imgQrCode.Picture.Bitmap.Canvas.Unlock;
  end;
end;

mbnoimi avatar Aug 14 '24 13:08 mbnoimi

Create the component and set OnGetQrcode in the create form to test

DjotaHasse avatar Aug 14 '24 13:08 DjotaHasse

I wonder why you closed this issue while it related to #92 ?! I'm still unable to use WPP4Delphi properly because I'm still unable to install any component!

mbnoimi avatar Sep 15 '24 06:09 mbnoimi

I reopened this issue, give more details than you need, it seems to me that you are not using it in the traditional way, you are creating in run time, adding and taking parts of the component, for this I will tag someone who is using it this way, which is a little different from the use of most developers, who use the component @ThiagoPedro

marcelo386 avatar Sep 15 '24 13:09 marcelo386

Create the component and set OnGetQrcode in the create form to test

Did it (I finally became able to install WPP4Delphi). I still get the same error message OnGetQrCode não foi definido

here is my recent modification:

unit MaintForm;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls,
  JsonDataObjects, System.NetEncoding,
  uTWPPConnect.ConfigCEF, uTWPPConnect, uTWPPConnect.Constant, uTWPPConnect.JS,
  uWPPConnectDecryptFile,
  uTWPPConnect.Console, uTWPPConnect.Diversos, uTWPPConnect.AdjustNumber,
  uTWPPConnect.Config, uTWPPConnect.Classes,
  uTWPPConnect.Emoticons;

type
  TMainForm = class(TForm)
    btnSendMessage: TButton;
    edtPhoneNumber: TEdit;
    memoMessage: TMemo;
    lblStatus: TLabel;
    imgQrCode: TImage;
    WPP: TWPPConnect;
    procedure btnSendMessageClick(Sender: TObject);
    function Base64ToBitmap(const Base64: string): TBitmap;
    procedure WPPGetQrCode(const Sender: TObject;
      const QrCode: TResultQRCodeClass);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure UpdateStatus(Status: string);
    function ExtractBase64(const Input: string): string;
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

function TMainForm.Base64ToBitmap(const Base64: string): TBitmap;
var
  InputStream: TStringStream;
  OutputStream: TMemoryStream;
begin
  Result := TBitmap.Create;
  InputStream := TStringStream.Create(Base64);
  OutputStream := TMemoryStream.Create;
  try
    TNetEncoding.Base64.Decode(InputStream, OutputStream);
    OutputStream.Position := 0;
    Result.LoadFromStream(OutputStream);
  finally
    InputStream.Free;
    OutputStream.Free;
  end;
end;

procedure TMainForm.UpdateStatus(Status: string);
begin
  lblStatus.Caption := 'Status: ' + Status;
end;

procedure TMainForm.WPPGetQrCode(const Sender: TObject;
  const QrCode: TResultQRCodeClass);
begin
  imgQrCode.Picture.Bitmap.Canvas.Lock;
  try
    imgQrCode.Picture.Bitmap := Base64ToBitmap(ExtractBase64(QrCode.AQrCode));
    Sleep(500);
    imgQrCode.BringToFront;
    imgQrCode.Repaint;
  finally
    imgQrCode.Picture.Bitmap.Canvas.Unlock;
  end;
end;

procedure TMainForm.btnSendMessageClick(Sender: TObject);
var
  TargetNumber, MessageText: string;
begin
  if not Assigned(WPP) then
    WPP := TWPPConnect.Create(Self);  // Ensure the WPP instance is created

  if not WPP.Auth(false) then
  begin
    WPP.FormQrCodeType := TFormQrCodeType(Ft_None);
    WPP.FormQrCodeStart();
  end;

  UpdateStatus('Not Connected');
  TargetNumber := edtPhoneNumber.Text + '@c.us';
  MessageText := memoMessage.Lines.Text;

  if WPP.Auth(True) then
  begin
    UpdateStatus('Connected');
    WPP.Send(TargetNumber, MessageText);
  end
  else
  begin
    UpdateStatus('Authentication required. Please scan the QR code.');
    ShowMessage('Authentication failed. Please scan the QR code.');
  end;
end;


function TMainForm.ExtractBase64(const Input: string): string;
begin
  Result := Copy(Input, Pos('base64,', Input) + 7, Length(Input));
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  WPP.OnGetQrCode := WPPGetQrCode;
end;

end.

You can find the full project here: SimpleDemo.zip

mbnoimi avatar Sep 16 '24 03:09 mbnoimi

@DjotaHasse as you can see in MaintForm.dfm the component event is already defined.

object WPP: TWPPConnect
    InjectJS.AutoUpdateTimeOut = 10
    InjectJS.JSURL = 
      'https://raw.githubusercontent.com/wppconnect-team/WPP4Delphi/mai' +
      'n/Source/JS/js.abr'
    InjectJS.DownloadJSType = DT_Indy
    Config.AutoDelay = 1000
    AjustNumber.LengthPhone = 8
    AjustNumber.DDIDefault = 55
    FormQrCodeType = Ft_Http
    OnGetQrCode = WPPGetQrCode
    Left = 304
    Top = 224
  end

mbnoimi avatar Sep 16 '24 03:09 mbnoimi

If you placed the component on the screen, it doesn't make sense for you to create the event at run time, click on the component, press F11, go to the events tab, double click on OnGetQrCode and that's it, problem solved.

DjotaHasse avatar Sep 16 '24 10:09 DjotaHasse

Another thing, the component has a demo folder with a project that is used as an operating parameter for devs who are starting to use it, run this demo and see if it works correctly.

DjotaHasse avatar Sep 16 '24 10:09 DjotaHasse

If you placed the component on the screen, it doesn't make sense for you to create the event at run time, click on the component, press F11, go to the events tab, double click on OnGetQrCode and that's it, problem solved.

I already did as I quoted from MaintForm.dfm

image

BTW, I attached the simple project. May you please take a look into it?

mbnoimi avatar Sep 16 '24 11:09 mbnoimi

If you created the event directly through the component, you don't need to set the event at run time, remove this from your project: procedure TMainForm.FormCreate(Sender: TObject); begin WPP.OnGetQrCode := WPPGetQrCode; end;

DjotaHasse avatar Sep 16 '24 11:09 DjotaHasse

Another thing, the component has a demo folder with a project that is used as an operating parameter for devs who are starting to use it, run this demo and see if it works correctly.

Crashes for unknown reason although I put all the dependencies in C:\Executaveis\WPPConnectDemo

image

image

image

ConfTWPPConnect.ini

[Path Defines]
Data User=C:\Executaveis\WPPConnectDemo\User Data
FrameWork=C:\Executaveis\WPPConnectDemo
Binary=C:\Executaveis\WPPConnectDemo
Locales=C:\Executaveis\WPPConnectDemo\locales
Cache=C:\Executaveis\WPPConnectDemo\cache
Log File=C:\Executaveis\WPPConnectDemo\LogTWppConnect\
Log Console=C:\Executaveis\WPPConnectDemo\LogTWppConnect\
GPU=1
Log Severity=0
Log Console Active=0
language=pt-BR
Auto Receiver attached=0
[TWPPConnect Comp]
TWPPConnect Versão=3.9.0.0
Caminho JS=https://raw.githubusercontent.com/wppconnect-team/WPP4Delphi/main/Source/JS/js.abr
CEF4 Versão=109.1.18.0
CHROME Versão=109.0.5414.120
Dlls=libcef.dll / chrome_elf.dll
Ultima interação=16/09/24 05:08:26
[Config]
AcceptLanguageList=pt-BR,pt-BR;q=0.9,en-US;q=0.8,en;q=0.7
SecondsMonitor=
SecondsMonitorNew=
Evento_msg_ack_change=
Evento_msg_revoke=
Evento_new_message=
Evento_new_reaction=
Evento_active_chat=
Evento_update_label=
Evento_presence_change=
Evento_group_participant_changed=
Evento_live_location_start=
Evento_order_payment_status=
[Informacao]
Aplicativo vinculado=C:\Executaveis\WPPConnectDemo\WPPConnectDemo.exe
Valor True=1
Valor False=0

The runtime files copied from:

  • cef_binary_109.1.18+gf1c41e4+chromium-109.0.5414.120_windows32\Debug
  • cef_binary_109.1.18+gf1c41e4+chromium-109.0.5414.120_windows32\Resources
  • WPP4Delphi\Demo\DLL's\dlls para Could not load SSL library.zip

mbnoimi avatar Sep 16 '24 12:09 mbnoimi

Delete this file ini and recopile the project.

DjotaHasse avatar Sep 16 '24 12:09 DjotaHasse

Delete this file ini and recopile the project.

Got this runtime error:

First chance exception at $765BFA72. Exception class EIdOSSLUnderlyingCryptoError with message
'Error connecting with SSL.
error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version'.
Process WPPConnectDemo.exe (6772)

image

image

mbnoimi avatar Sep 17 '24 08:09 mbnoimi

I belive this issue related to an old OpenSSL binaries. It seems WPP4Delphi uses OpenSSL 1.x.x while the valid one is 1.1.x or 3.x.x So I tried to use openssl-1.1.1w-win32 but WPP4Delphi demo project didn't accept it! After 1 hrs googling I figured out that:

OpenSSL version 1.1.x no longer uses the libeay32.dll and ssleay32.dll files. These were replaced in OpenSSL 1.1.x with the following:

  • libcrypto-1_1.dll (replaces libeay32.dll)
  • libssl-1_1.dll (replaces ssleay32.dll)

How this demo runs in your machines while it uses deprecated ssl binaries?!

mbnoimi avatar Sep 17 '24 09:09 mbnoimi

Inside the component folder there is a folder with the openssl dlls, or you can go to the component properties, InjectJS - DownloadJSType and change it to DT_Rest

DjotaHasse avatar Sep 17 '24 10:09 DjotaHasse

Inside the component folder there is a folder with the openssl dlls,

There is no such folder in project tree (DEMO or WPP4Delphi)

or you can go to the component properties, InjectJS - DownloadJSType and change it to DT_Rest

Did it. still get a runtime error!

image

mbnoimi avatar Sep 17 '24 10:09 mbnoimi

There is no such folder in project tree (DEMO or WPP4Delphi)

Inside the DEMO folder there is the DLLs subfolder

Did it. still get a runtime error!

What error occurs?

This error is occurring when downloading the updated js.abr file. This error may also be occurring due to an operating system problem, it is important that it is updated to update the TLS protocol, this error is no longer due to the component.

DjotaHasse avatar Sep 17 '24 10:09 DjotaHasse

To overcome this error, in the InjectJS - AutoUpdate component property, change it from true to false so that the component will not try to download the js file, but this file always changes because it contains the js commands that are injected into the CEF for operation of the component, if it becomes very outdated, some commands stop working and you will have to update this file manually in your project folder.

DjotaHasse avatar Sep 17 '24 10:09 DjotaHasse

Inside the DEMO folder there is the DLLs subfolder

I mentioned before that I used these dlls.

WPP4Delphi\Demo\DLL's\dlls para Could not load SSL library.zip

What error occurs?

a runtime error. I couldn't capture its details. Below a screenshot after run with debug image

This error is occurring when downloading the updated js.abr file. This error may also be occurring due to an operating system problem, it is important that it is updated to update the TLS protocol, this error is no longer due to the component.

There is no way this issue related to my operating system because Chrome works fine with Web Whatsapp.

To overcome this error, in the InjectJS - AutoUpdate component property, change it from true to false so that the component will not try to download the js file

Tried it. Nothing changed! The demo still crashes

mbnoimi avatar Sep 17 '24 11:09 mbnoimi

image

mbnoimi avatar Sep 17 '24 11:09 mbnoimi

It's not because your Chrome opens webwhats that the component has the same behavior, the component uses a Chromium engine. And this error has nothing to do with Chrome, it's happening because it's not being able to download the js file as I mentioned. We have a WhatsApp group with more than 500 members using the component. This error that you are experiencing is a problem in Indy with openssl dlls, so just search on Google to find a solution.

DjotaHasse avatar Sep 17 '24 11:09 DjotaHasse

It could be a firewall, antivirus, something on your network that could block this as well

DjotaHasse avatar Sep 17 '24 11:09 DjotaHasse

just search on Google to find a solution.

This project has a tiny community so there are no useful result on Google. I Googled a lot before asking my question and if you noticed this issue published since a while which means I reach to a dead end.

mbnoimi avatar Sep 17 '24 11:09 mbnoimi