uim_1977 36 Light Poster

I'm developming a programm thet will use a dll forms, the problem i'm getting i have several forms in each dll, some of them have to use functions from other forms. For example, i have a DLL "Customers" which includes Customers form, Customer Selection List, which is a a different form in the same DLL, the problem is thet i'm getting an error message when i try to call function located on a CustomerForm, from CustomerSearch form.

here is the cod i'm trying to build

//$$---- Form CPP ----
CustSearch.Cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "CustSearch.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TSearchCustomerF *SearchCustomerF;
//---------------------------------------------------------------------------
__fastcall TSearchCustomerF::TSearchCustomerF(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TSearchCustomerF::Button1Click(TObject *Sender)
{

CustomerF->Search(Edit1->Text, "NAME", CustomerF->IBTable1);

}
//---------------------------------------------------------------------------

////////////////////////////////////////////////////////////////////////////////////////////////


CustomerForm.Cpp
//$$---- Form CPP ----
//---------------------------------------------------------------------------

#include <vcl.h>
#include <Inifiles.hpp>
#pragma hdrstop

#include "CustomerForm.h"
#include "DataModul.h"
#include "CustSearch.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "IBCustomDataSet"
#pragma link "IBDatabase"
#pragma link "IBTable"
#pragma resource "*.dfm"

TSearchCustomerF* DllCustomerSearch;
TCustomerF *CustomerF;
Pointer GenPointer;


//---------------------------------------------------------------------------
__fastcall TCustomerF::TCustomerF(TComponent* Owner)
	: TForm(Owner)
{

}
//---------------------------------------------------------------------------

void __stdcall CreateCustomerSearch(TComponent* Owner)
{
	DllCustomerSearch = new TSearchCustomerF (Owner);
	DllCustomerSearch->ShowModal();
}
//---------------------------------------------------------------------------



void __fastcall TCustomerF::Search (AnsiString NameP, AnsiString FieldP, TIBTable* Table)
 {

	TLocateOptions Opts;
	Opts.Clear();
	Opts << loPartialKey;
	Opts << loCaseInsensitive;
Table->Locate(FieldP,NameP, Opts );
 Table->IndexFieldNames=FieldP;
}
//---------------------------------------------------------------------------
void __fastcall TCustomerF::Search1 (AnsiString NameP, AnsiString FieldP, int i)
 {
 if (i==1) {
	 Search(NameP, FieldP, IBTable1);
 }

 }



//---------------------------------------------------------------------------

void __fastcall TCustomerF::Save(TIBTable* Table, TIBTransaction* Transaction)
{
int i=0;
	AnsiString a;
	if (Table==IBTable1) {

	if (Table->State==dsInsert) {
		i=1;
	}
	if (Table->State==dsEdit) {
		i=2;

	a=IBTable1->FieldByName("ID")->Value;
	}
	}
	Table->Post();
	Transaction->Commit();
	Table->Active=true;
	if (i==1) {
	Table->Last();
	}
	if (i==2) {
	Search(a, "ID", Table);
	}

}
//---------------------------------------------------------------------------



AnsiString __fastcall TCustomerF::GetPath()
{
AnsiString Path;
TIniFile *  newIniFile = new TIniFile(ChangeFileExt(Application->ExeName, ".INI"));
try{
Path = newIniFile->ReadString("OUTLOOK","PathStr", "C:");
return Path;
}
__finally {
	delete newIniFile;
}
return Path;
}
//---------------------------------------------------------------------------


void __fastcall TCustomerF::Button3Click(TObject *Sender)
{
Save(IBTable1, IBTransaction1);
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::Button1Click(TObject *Sender)
{
IBTable1->Append();
}
//---------------------------------------------------------------------------


void __fastcall TCustomerF::IBTable1AfterEdit(TDataSet *DataSet)
{
Button1->Enabled=false;
Button3->Enabled=true;
Button2->Enabled=true;
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::IBTable1AfterInsert(TDataSet *DataSet)
{
Button1->Enabled=false;
Button3->Enabled=true;
Button2->Enabled=true;
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::IBTable1AfterTransactionEnd(TObject *Sender)
{
Button3->Enabled=false;
Button1->Enabled=true;
Button2->Enabled=false;
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::IBTable1AfterOpen(TDataSet *DataSet)
{
Button3->Enabled=false;
Button1->Enabled=true;
Button2->Enabled=false;
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::Button2Click(TObject *Sender)
{
IBTable1->Cancel();
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::IBTable1AfterCancel(TDataSet *DataSet)
{
Button3->Enabled=false;
Button1->Enabled=true;
Button2->Enabled=false;	
}
//---------------------------------------------------------------------------


void __fastcall TCustomerF::TabSheet4Enter(TObject *Sender)
{
if (IBTable1->State==dsInsert ||IBTable1->State==dsEdit) {
		Save(IBTable1, IBTransaction1);
	}

}
//---------------------------------------------------------------------------


void __fastcall TCustomerF::TabSheet5Enter(TObject *Sender)
{
if (IBTable1->State==dsInsert ||IBTable1->State==dsEdit) {
		Save(IBTable1, IBTransaction1);
	}
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::FormCreate(TObject *Sender)
{
this->Position=poDesktopCenter;
IBTable1->Active=true;
IBTable2->Active=true;
IBTable3->Active=true;
IBTable4->Active=true;
IBTable5->Active=true;

}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::Button4Click(TObject *Sender)
{
  IBTable3->Insert();
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::Button5Click(TObject *Sender)
{
Save(IBTable3, IBTransaction3);
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::Button6Click(TObject *Sender)
{
IBTable3->Delete();
IBTransaction3->Commit();
IBTable3->Active=true;
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::Button7Click(TObject *Sender)
{
IBTable5->Insert();	
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::Button8Click(TObject *Sender)
{
Save(IBTable5, IBTransaction4);	
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::Button9Click(TObject *Sender)
{
IBTable5->Delete();
IBTransaction4->Commit();
IBTable5->Active=true;
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::IBTable3AfterTransactionEnd(TObject *Sender)
{
Button4->Enabled=true;
Button6->Enabled=true;
Button5->Enabled=false;

}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::IBTable3AfterOpen(TDataSet *DataSet)
{
Button4->Enabled=true;
Button6->Enabled=true;
Button5->Enabled=false;

}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::IBTable3AfterInsert(TDataSet *DataSet)
{
Button4->Enabled=false;
Button6->Enabled=false;
Button5->Enabled=true;

}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::IBTable3AfterEdit(TDataSet *DataSet)
{
Button4->Enabled=false;
Button6->Enabled=false;
Button5->Enabled=true;

}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::IBTable5AfterTransactionEnd(TObject *Sender)
{
Button7->Enabled=true;
Button8->Enabled=false;
Button9->Enabled=true;

}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::IBTable5AfterPost(TDataSet *DataSet)
{

Button7->Enabled=true;
Button8->Enabled=false;
Button9->Enabled=true;
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::IBTable5AfterOpen(TDataSet *DataSet)
{

Button7->Enabled=true;
Button8->Enabled=false;
Button9->Enabled=true;
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::IBTable5AfterInsert(TDataSet *DataSet)
{

Button7->Enabled=false;
Button8->Enabled=true;
Button9->Enabled=false;
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::SpeedButton3Click(TObject *Sender)
{

AnsiString Addres="/c ipm.note /m "+DBEdit17->Text;
ShellExecute(NULL, "open", GetPath().c_str(),Addres.c_str() , NULL, SW_SHOWNORMAL);
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::SpeedButton4Click(TObject *Sender)
{

AnsiString Addres="/c ipm.note /m "+DBEdit18->Text;
ShellExecute(NULL, "open", GetPath().c_str(),Addres.c_str() , NULL, SW_SHOWNORMAL);
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::SpeedButton5Click(TObject *Sender)
{

AnsiString Addres="/c ipm.note /m "+DBEdit25->Text;
ShellExecute(NULL, "open", GetPath().c_str(),Addres.c_str() , NULL, SW_SHOWNORMAL);
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::SpeedButton6Click(TObject *Sender)
{

AnsiString Addres="/c ipm.note /m "+DBEdit37->Text;
ShellExecute(NULL, "open", GetPath().c_str(),Addres.c_str() , NULL, SW_SHOWNORMAL);
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::SpeedButton7Click(TObject *Sender)
{

AnsiString Addres="/c ipm.note /m "+DBEdit55->Text;
ShellExecute(NULL, "open", GetPath().c_str(),Addres.c_str() , NULL, SW_SHOWNORMAL);
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::SpeedButton8Click(TObject *Sender)
{

AnsiString Addres="/c ipm.note /m "+DBEdit56->Text;
ShellExecute(NULL, "open", GetPath().c_str(),Addres.c_str() , NULL, SW_SHOWNORMAL);
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::DBEdit3KeyDown(TObject *Sender, WORD &Key,
	  TShiftState Shift)
{
if (Key==VK_F9)
{
Search(DBEdit3->Text, "NAME", IBTable1);
}
if (Key==VK_F8) {
	IBTable1->Next();
	}
if (Key==VK_F7) {
	IBTable1->Prior();
	}
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::DBEdit1KeyDown(TObject *Sender, WORD &Key,
	  TShiftState Shift)
{
if (Key==VK_F9)
{
Search(DBEdit1->Text, "ID", IBTable1);
}
if (Key==VK_F8) {
	IBTable1->Next();
	}
if (Key==VK_F7) {
	IBTable1->Prior();
	}
}
//---------------------------------------------------------------------------


void __fastcall TCustomerF::SpeedButton1Click(TObject *Sender)
{
CreateCustomerSearch(this);	
}
//---------------------------------------------------------------------------

void __fastcall TCustomerF::SpeedButton2Click(TObject *Sender)
{
GenPointer=Addr(
}
//---------------------------------------------------------------------------

The Search Function works pirfect internaly, when it is called from the CustomerForm.cpp But once i call teh function from the Search Customer form it gives an error
"Access violation at address 00E41F03 in module 'Customer.dll' Read of Address 00000360."

Can any one help me ??????? please

Ancient Dragon commented: Thanks for using code tags on first try :) +36

Dani AI

Generated

— the access violation you're seeing is almost always caused by calling a method on an invalid pointer (the search form is trying to reach the customer form but the pointer it uses isn’t a valid instance inside the dialog). Two common root causes in BCB6 DLL scenarios: (1) you’re relying on globals that aren’t the same symbol/instance across units, or (2) the search dialog never gets a proper pointer to the customer form (so it dereferences NULL/garbage).

Fix checklist (fast, practical):

  • Stop relying on an implicit global. Pass the customer-form pointer explicitly when you create the search dialog and store it in a member field on the dialog. Example pattern:
// exported by the DLL
extern "C" void __stdcall ShowSearchDialog(TComponent* owner, TCustomerForm* parent)
{
    TSearchDialog* dlg = new TSearchDialog(owner);
    dlg->ParentCustomer = parent;   // explicit, reliable pointer
    dlg->ShowModal();
    delete dlg;
}

Inside the dialog, always check the pointer before use:

if (ParentCustomer) {
    ParentCustomer->DoLocate(...);
} else {
    ShowMessage("ParentCustomer not set");
}
  • If you prefer not to add a field, use the Owner pointer safely: check Owner != NULL and Owner->InheritsFrom(__classid(TCustomerForm)) before casting and calling methods.

  • Make sure you do not have duplicate global definitions in different units (use a single extern declaration in the header and one definition in a single .cpp). Inconsistent globals commonly produce the “different instances” problem.

Longer-term safety: avoid passing VCL objects freely across EXE/DLL boundaries unless both modules share the VCL (use runtime packages/BPLs). If you can’t use packages, keep the DLL/EXE interface to primitive types (IDs/strings) or export wrapper functions that perform the UI interaction entirely inside the DLL.

Quick debug tip: before calling the customer method add a runtime check that shows the pointer/address — that will confirm whether the pointer is NULL or garbage and point you to which of the fixes above you should apply.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.