Конечно возможно. Есть несколько способов. Вот 2 самых очевидных.
1) Передавать дескриптор (Handle) формы в DLL в виде long (DWORD), затем посылать сообщения (API-шные или пользовательские), например
// MainForm.h
#define WM_MYMESSAGE WM_USER+1
// ...
void __fastcall MyMessageHandler(TMessage &AMessage);
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_MYMESSAGE , TMessage, MyMessageHandler);
END_MESSAGE_MAP(TForm);
// MainForm.cpp
void __fastcall TMainForm::MyMessageHandler(TMessage &AMessage)
{
String* ACaption = reinterpret_castString*>(AMessage.WParam);
if(ACaption) {
Caption = *ACaption;
delete ACaption;
}
}
2) Передавать указатель на форму в DLL в виде void*, затем приводить его к типу TForm*:
// из приложения:
DLLFunction("caption", (void*)this);
// функция в DLL:
void DLLFunction(const char* ACaption, void* AData)
{
if(!AData) return;
TForm* FM = reinterpret_castTForm*>(AData);
if(FM) FM->Caption = ACaption;
}
Конечно, в DLL д.б. подключены модули для работы с VCL (Forms, Classes).