I don't know how to setup the declaration and initialization of SecureBridge event handling procedures in a C++ Builder console application. I get the following errors (in RAD Studio 2007, C++ Builder 2007 personality) when I try to build the code following it :
[BCC32 Error] File1.cpp(37): E2034 Cannot convert 'void (_fastcall *)(TObject *,TScSSHClientInfo *,const AnsiString,bool &)' to 'TScCheckUserPass'
[BCC32 Error] File1.cpp(38): E2034 Cannot convert 'void (_fastcall *)(TObject *,TScSSHClientInfo *,TScKey *,bool &)' to 'TScCheckUserKey'
[BCC32 Error] File1.cpp(41): E2034 Cannot convert 'void (_fastcall *)(TObject *,TScKey *,bool &)' to 'TScServerKeyValidate'
[BCC32 Error] File1.cpp(49): E2034 Cannot convert 'void (_fastcall *)(TObject *)' to 'TScAsyncReceive'
[BCC32 Error] File1.cpp(87): E2451 Undefined symbol 'ScSSHShell1'
Can anyone please help me ? Thanks.
-- Don
// CODE START ///////////////////////////////////////////////
//---------------------------------------------------------------------------
#include
#include
#pragma hdrstop
#include "ScBridge.hpp"
#include "ScSSHChannel.hpp"
#include "ScSSHClient.hpp"
void __fastcall ScSSHClient1ServerKeyValidate(TObject *Sender,
TScKey *NewServerKey, bool &Accept);
void __fastcall ScRegStorage1CheckUserKey(TObject *Sender,
TScSSHClientInfo *ClientInfo, TScKey *Key, bool &Accept);
void __fastcall ScRegStorage1CheckUserPass(TObject *Sender,
TScSSHClientInfo *ClientInfo, const AnsiString Password,
bool &Accept);
void __fastcall ScSSHShell1AsyncReceive(TObject *Sender);
bool command_sent = false;
AnsiString server_receipt_str = "",
cum_server_receipt_str = "";
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
AnsiString command_str,
param_str_i;
int i;
TReplaceFlags rf;
TScRegStorage* ScRegStorage1 = new TScRegStorage(NULL);
TScSSHClient* ScSSHClient1 = new TScSSHClient(NULL);
TScSSHShell* ScSSHShell1 = new TScSSHShell(NULL);
ScRegStorage1->OnCheckUserPass = ScRegStorage1CheckUserPass;
ScRegStorage1->OnCheckUserKey = ScRegStorage1CheckUserKey;
ScSSHClient1->KeyStorage = ScRegStorage1;
ScSSHClient1->OnServerKeyValidate = ScSSHClient1ServerKeyValidate;
ScSSHClient1->HostName = "mtolx195.dc.mars";
ScSSHClient1->User = "oracle";
ScSSHClient1->Password = "dudley";
ScSSHClient1->Connected = true;
ScSSHShell1->Client = ScSSHClient1;
ScSSHShell1->OnAsyncReceive = ScSSHShell1AsyncReceive;
ScSSHShell1->NonBlocking = true;
ScSSHShell1->Connected = true;
rf = rf "))
) { // Wait to send command till get "==>" prompt
Application->ProcessMessages();
};
cum_server_receipt_str = "";
command_sent = true;
ScSSHShell1->WriteString(command_str + "\n");
while (
(ScSSHShell1->OutCount > 0) ||
(0 == cum_server_receipt_str.Pos("==>"))
) {
Application->ProcessMessages();
};
ScSSHShell1->Connected = false;
ScSSHClient1->Connected = false;
return 0;
}
//---------------------------------------------------------------------------
void __fastcall ScSSHShell1AsyncReceive(TObject *Sender)
{
server_receipt_str = ScSSHShell1->ReadString();
if (command_sent) {
puts(server_receipt_str.c_str());
};
cum_server_receipt_str = cum_server_receipt_str + server_receipt_str;
}
//---------------------------------------------------------------------------
void __fastcall ScSSHClient1ServerKeyValidate(TObject *Sender,
TScKey *NewServerKey, bool &Accept)
{
Accept = true;
}
//---------------------------------------------------------------------------
void __fastcall ScRegStorage1CheckUserKey(TObject *Sender,
TScSSHClientInfo *ClientInfo, TScKey *Key, bool &Accept)
{
Accept = true;
}
//---------------------------------------------------------------------------
void __fastcall ScRegStorage1CheckUserPass(TObject *Sender,
TScSSHClientInfo *ClientInfo, const AnsiString Password, bool &Accept)
{
Accept = true;
}
//---------------------------------------------------------------------------
// CODE END ///////////////////////////////////////////////
Using SecureBridge components in C++ Builder console app
Event handlers should be methods of some class, but not procedures.
You should use the following code:
You should use the following code:
Code: Select all
#include
#include
#pragma hdrstop
#include "ScBridge.hpp"
#include "ScSSHChannel.hpp"
#include "ScSSHClient.hpp"
class TSSHEvents
{
public:
void __fastcall ScSSHClient1ServerKeyValidate(TObject *Sender,
TScKey *NewServerKey, bool &Accept);
void __fastcall ScRegStorage1CheckUserKey(TObject *Sender,
TScSSHClientInfo *ClientInfo, TScKey *Key, bool &Accept);
void __fastcall ScRegStorage1CheckUserPass(TObject *Sender,
TScSSHClientInfo *ClientInfo, const AnsiString Password,
bool &Accept);
void __fastcall ScSSHShell1AsyncReceive(TObject *Sender);
};
bool command_sent = false;
AnsiString server_receipt_str = "",
cum_server_receipt_str = "";
TSSHEvents* SSHEvents;
TScRegStorage* ScRegStorage1;
TScSSHClient* ScSSHClient1;
TScSSHShell* ScSSHShell1;
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
AnsiString command_str,
param_str_i;
int i;
TReplaceFlags rf;
SSHEvents = new TSSHEvents;
ScRegStorage1 = new TScRegStorage(NULL);
ScSSHClient1 = new TScSSHClient(NULL);
ScSSHShell1 = new TScSSHShell(NULL);
ScRegStorage1->OnCheckUserPass = SSHEvents->ScRegStorage1CheckUserPass;
ScRegStorage1->OnCheckUserKey = SSHEvents->ScRegStorage1CheckUserKey;
ScSSHClient1->KeyStorage = ScRegStorage1;
ScSSHClient1->OnServerKeyValidate = SSHEvents->ScSSHClient1ServerKeyValidate;
ScSSHClient1->HostName = "mtolx195.dc.mars";
ScSSHClient1->User = "oracle";
ScSSHClient1->Password = "dudley";
ScSSHClient1->Connected = true;
ScSSHShell1->Client = ScSSHClient1;
ScSSHShell1->OnAsyncReceive = SSHEvents->ScSSHShell1AsyncReceive;
ScSSHShell1->NonBlocking = true;
ScSSHShell1->Connected = true;
rf = rf "))
) { // Wait to send command till get "==>" prompt
Application->ProcessMessages();
};
cum_server_receipt_str = "";
command_sent = true;
ScSSHShell1->WriteString(command_str + "\n");
while (
(ScSSHShell1->OutCount > 0) ||
(0 == cum_server_receipt_str.Pos("==>"))
) {
Application->ProcessMessages();
};
ScSSHShell1->Connected = false;
ScSSHClient1->Connected = false;
return 0;
}
//---------------------------------------------------------------------------
void __fastcall TSSHEvents::ScSSHShell1AsyncReceive(TObject *Sender)
{
server_receipt_str = ScSSHShell1->ReadString();
if (command_sent) {
puts(server_receipt_str.c_str());
};
cum_server_receipt_str = cum_server_receipt_str + server_receipt_str;
}
//---------------------------------------------------------------------------
void __fastcall TSSHEvents::ScSSHClient1ServerKeyValidate(TObject *Sender,
TScKey *NewServerKey, bool &Accept)
{
Accept = true;
}
//---------------------------------------------------------------------------
void __fastcall TSSHEvents::ScRegStorage1CheckUserKey(TObject *Sender,
TScSSHClientInfo *ClientInfo, TScKey *Key, bool &Accept)
{
Accept = true;
}
//---------------------------------------------------------------------------
void __fastcall TSSHEvents::ScRegStorage1CheckUserPass(TObject *Sender,
TScSSHClientInfo *ClientInfo, const AnsiString Password, bool &Accept)
{
Accept = true;
}
Console app EXE - No runtime packages/libraries - Linker err
Thanks, Dimon :
Great ! Putting the event handlers into the class took care of that issue...
Now, I want to deploy WITHOUT runtime libraries and runtime packages, i.e. as a single EXE file.
I UN-checked the relevant "Project Options", i.e. "Dynamic RTL" and "Build with runtime packages".
However, now I get the following Linker errors:
[ILINK32 Error] Fatal: Unable to open file "SCBRIDGE.OBJ"
[ILINK32 Error] Fatal: Unable to open file "SCSSHCHANNEL.OBJ"
[ILINK32 Error] Fatal: Unable to open file "SCSSHCLIENT.OBJ"
I have the standard version, and have ".DCU" files for those modules, but
NO ".OBJ" files.
I tried compiling the ".DCU" files, to no avail..
What should I do now ?
Thanks.
Current code is :
//---------------------------------------------------------------------------
#include
#include
#pragma hdrstop
#include "ScBridge.hpp"
#include "ScSSHChannel.hpp"
#include "ScSSHClient.hpp"
#pragma package(smart_init)
#pragma link "ScBridge"
#pragma link "ScSSHChannel"
#pragma link "ScSSHClient"
class TSSHEvents
{
public:
void __fastcall ScSSHClient1ServerKeyValidate(TObject *Sender,TScKey *NewServerKey, bool &Accept);
void __fastcall ScRegStorage1CheckUserKey(TObject *Sender,TScSSHClientInfo *ClientInfo, TScKey *Key, bool &Accept);
void __fastcall ScRegStorage1CheckUserPass(TObject *Sender,TScSSHClientInfo *ClientInfo, const AnsiString Password, bool &Accept);
void __fastcall ScSSHShell1AsyncReceive(TObject *Sender);
};
TScRegStorage* ScRegStorage1;
TScSSHClient* ScSSHClient1;
TScSSHShell* ScSSHShell1;
TSSHEvents* SSHEvents;
bool command_sent = false;
AnsiString server_receipt_str = "",
cum_server_receipt_str = "",
prompt_str = "==>";
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
AnsiString command_str,
param_str_i;
int i;
TReplaceFlags rf;
SSHEvents = new TSSHEvents;
ScRegStorage1 = new TScRegStorage(NULL);
ScSSHClient1 = new TScSSHClient(NULL);
ScSSHShell1 = new TScSSHShell(NULL);
ScRegStorage1->OnCheckUserPass = SSHEvents->ScRegStorage1CheckUserPass;
ScRegStorage1->OnCheckUserKey = SSHEvents->ScRegStorage1CheckUserKey;
ScSSHClient1->KeyStorage = ScRegStorage1;
ScSSHClient1->OnServerKeyValidate = SSHEvents->ScSSHClient1ServerKeyValidate;
ScSSHClient1->HostName = "mtolx195.dc.mars";
ScSSHClient1->User = "oracle";
ScSSHClient1->Password = "dudley";
ScSSHClient1->Connected = true;
ScSSHShell1->Client = ScSSHClient1;
ScSSHShell1->OnAsyncReceive = SSHEvents->ScSSHShell1AsyncReceive;
ScSSHShell1->NonBlocking = true;
ScSSHShell1->Connected = true;
rf = rf " prompt
Application->ProcessMessages();
};
cum_server_receipt_str = "";
command_sent = true;
ScSSHShell1->WriteString(command_str + "\n");
while (
(ScSSHShell1->OutCount > 0) ||
(0 == cum_server_receipt_str.Pos(prompt_str))
) {
Application->ProcessMessages();
};
ScSSHShell1->Connected = false;
ScSSHClient1->Connected = false;
delete ScSSHShell1;
delete ScSSHClient1;
delete ScRegStorage1;
delete SSHEvents;
return 0;
}
//---------------------------------------------------------------------------
void __fastcall TSSHEvents::ScSSHShell1AsyncReceive(TObject *Sender)
{
server_receipt_str = ScSSHShell1->ReadString();
if (command_sent) {
puts(server_receipt_str.c_str());
};
cum_server_receipt_str = cum_server_receipt_str + server_receipt_str;
}
//---------------------------------------------------------------------------
void __fastcall TSSHEvents::ScSSHClient1ServerKeyValidate(TObject *Sender,
TScKey *NewServerKey, bool &Accept)
{
Accept = true;
}
//---------------------------------------------------------------------------
void __fastcall TSSHEvents::ScRegStorage1CheckUserKey(TObject *Sender,
TScSSHClientInfo *ClientInfo, TScKey *Key, bool &Accept)
{
Accept = true;
}
//---------------------------------------------------------------------------
void __fastcall TSSHEvents::ScRegStorage1CheckUserPass(TObject *Sender,
TScSSHClientInfo *ClientInfo, const AnsiString Password, bool &Accept)
{
Accept = true;
}
//---------------------------------------------------------------------------
Great ! Putting the event handlers into the class took care of that issue...
Now, I want to deploy WITHOUT runtime libraries and runtime packages, i.e. as a single EXE file.
I UN-checked the relevant "Project Options", i.e. "Dynamic RTL" and "Build with runtime packages".
However, now I get the following Linker errors:
[ILINK32 Error] Fatal: Unable to open file "SCBRIDGE.OBJ"
[ILINK32 Error] Fatal: Unable to open file "SCSSHCHANNEL.OBJ"
[ILINK32 Error] Fatal: Unable to open file "SCSSHCLIENT.OBJ"
I have the standard version, and have ".DCU" files for those modules, but
NO ".OBJ" files.
I tried compiling the ".DCU" files, to no avail..
What should I do now ?
Thanks.
Current code is :
//---------------------------------------------------------------------------
#include
#include
#pragma hdrstop
#include "ScBridge.hpp"
#include "ScSSHChannel.hpp"
#include "ScSSHClient.hpp"
#pragma package(smart_init)
#pragma link "ScBridge"
#pragma link "ScSSHChannel"
#pragma link "ScSSHClient"
class TSSHEvents
{
public:
void __fastcall ScSSHClient1ServerKeyValidate(TObject *Sender,TScKey *NewServerKey, bool &Accept);
void __fastcall ScRegStorage1CheckUserKey(TObject *Sender,TScSSHClientInfo *ClientInfo, TScKey *Key, bool &Accept);
void __fastcall ScRegStorage1CheckUserPass(TObject *Sender,TScSSHClientInfo *ClientInfo, const AnsiString Password, bool &Accept);
void __fastcall ScSSHShell1AsyncReceive(TObject *Sender);
};
TScRegStorage* ScRegStorage1;
TScSSHClient* ScSSHClient1;
TScSSHShell* ScSSHShell1;
TSSHEvents* SSHEvents;
bool command_sent = false;
AnsiString server_receipt_str = "",
cum_server_receipt_str = "",
prompt_str = "==>";
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
AnsiString command_str,
param_str_i;
int i;
TReplaceFlags rf;
SSHEvents = new TSSHEvents;
ScRegStorage1 = new TScRegStorage(NULL);
ScSSHClient1 = new TScSSHClient(NULL);
ScSSHShell1 = new TScSSHShell(NULL);
ScRegStorage1->OnCheckUserPass = SSHEvents->ScRegStorage1CheckUserPass;
ScRegStorage1->OnCheckUserKey = SSHEvents->ScRegStorage1CheckUserKey;
ScSSHClient1->KeyStorage = ScRegStorage1;
ScSSHClient1->OnServerKeyValidate = SSHEvents->ScSSHClient1ServerKeyValidate;
ScSSHClient1->HostName = "mtolx195.dc.mars";
ScSSHClient1->User = "oracle";
ScSSHClient1->Password = "dudley";
ScSSHClient1->Connected = true;
ScSSHShell1->Client = ScSSHClient1;
ScSSHShell1->OnAsyncReceive = SSHEvents->ScSSHShell1AsyncReceive;
ScSSHShell1->NonBlocking = true;
ScSSHShell1->Connected = true;
rf = rf " prompt
Application->ProcessMessages();
};
cum_server_receipt_str = "";
command_sent = true;
ScSSHShell1->WriteString(command_str + "\n");
while (
(ScSSHShell1->OutCount > 0) ||
(0 == cum_server_receipt_str.Pos(prompt_str))
) {
Application->ProcessMessages();
};
ScSSHShell1->Connected = false;
ScSSHClient1->Connected = false;
delete ScSSHShell1;
delete ScSSHClient1;
delete ScRegStorage1;
delete SSHEvents;
return 0;
}
//---------------------------------------------------------------------------
void __fastcall TSSHEvents::ScSSHShell1AsyncReceive(TObject *Sender)
{
server_receipt_str = ScSSHShell1->ReadString();
if (command_sent) {
puts(server_receipt_str.c_str());
};
cum_server_receipt_str = cum_server_receipt_str + server_receipt_str;
}
//---------------------------------------------------------------------------
void __fastcall TSSHEvents::ScSSHClient1ServerKeyValidate(TObject *Sender,
TScKey *NewServerKey, bool &Accept)
{
Accept = true;
}
//---------------------------------------------------------------------------
void __fastcall TSSHEvents::ScRegStorage1CheckUserKey(TObject *Sender,
TScSSHClientInfo *ClientInfo, TScKey *Key, bool &Accept)
{
Accept = true;
}
//---------------------------------------------------------------------------
void __fastcall TSSHEvents::ScRegStorage1CheckUserPass(TObject *Sender,
TScSSHClientInfo *ClientInfo, const AnsiString Password, bool &Accept)
{
Accept = true;
}
//---------------------------------------------------------------------------