Obsluga formy z dll'a

0

Mam pytanie:
Jak mozna zmieniac teks w formie glownej w polu Edit->Text z poziomu biblioteki dll?
Mam biblioteke .dll, tylko nie wiem jak w niej wywolac funkcje np:
Form1->Edit1->Text = "Jakis teks";
lub
Form1->Label1->Caption = "Drugi text";
Jak przeslac takie polecenie do okna glownego programu, ktory wywolal dll'a?

0

Ja w swoim programie (choć to Delphi a nie C++) używam interfejsów i odpowiednią funkcją przesyłam pluginom adres komponentu TPanel, żeby wtyczka mogła na nim coś zrobić, napiszę w Pascalu, bo w C++ nie siedzę, więc mogą być błędy:

type
  PFrame = ^TFrame;

procedure Funkcja_W_DLL(Frame: PFrame);
var
 C: TComponent;
begin
  C := Frame^.FindComponent('Edit1');
  if C is TEdit then begin
    (C as TEdit).Text := 'nowy tekst';
  end;
end;

//Wwołanie z programu:
Funkcja_W_DLLu(Addr(Form1));
// W C++ to cos podobnego do tego będzie

typedef *TFrame PFrame;

void Funkcja_W_DLL(PFrame Frame){
  TComponent C;

  C = *Frame->FindComponent('Edit1');
  if (C is TEdit)
    (C as TEdit)->Text = 'nowy tekst';
}

// Wwołanie z programu:
Funkcja_W_DLLu(Addr(Form1));

U mnie na interfejsach działa bez zarzutu, w DLLach tak mi się wydaje że też powinno hulać aż miło bo to w SPACJA końcu tylko pointera się podaje.

//Edit:
Jednak w C++ też napisałem, najwyżej mnie ktoś sprostuje to i ja zobaczę jakie gafy walnąłem ;)

0
prgtw napisał(a)

Jednak w C++ też napisałem, najwyżej mnie ktoś sprostuje to i ja zobaczę jakie gafy walnąłem

Walnąłeś ;)

 
if (C is TEdit)
    (C as TEdit)->Text = 'nowy tekst';

plus parę innych drobiazgów.

Jak już to:

TEdit *pEdit = (TEdit*)Frame->FindComponent("Edit1");
  if (pEdit)pEdit->Text = "nowy tekst";

Z drugiej strony, jak masz dostęp np. do formy to po co używać TComponent::FindComponent???

0

Cóż IS, AS - przyzwyczajenia z Delphi ;)
Za C++ nie przepadam dlatego gafy, ale siedzę mocno w PHP i też mogłem trochę z niego wyciągnąć ale ... ważne że trochę rozjaśniłem problem (tak myślę).

Ale mając tylko wskaźnik do TForm to chyba nie możemy sądzić ,że ma komponent np. Label1, więc nie wiem co by było jakbyśmy się od razu bezpośrednio odwołali przez

TEdit pEdit = (TEdit*)Form->Edit1;

... chociaż zapewne pEdit byłby równy NULL i nic by się nie stało, ale ... nieważne

0
0x666 napisał(a)
TEdit *pEdit = (TEdit*)Frame->FindComponent("Edit1");
  if (pEdit)pEdit->Text = "nowy tekst";

Z drugiej strony, jak masz dostęp np. do formy to po co używać TComponent::FindComponent???

Kompilator pisze mi, ze nie zna zmiennej Fram.
Jak to ma wygladac w calosci?

0
nowyjar napisał(a)

Kompilator pisze mi, ze nie zna zmiennej Fram.

Nie zna, bo wskaźnik Frame to tylko przykład [!!!] Zresztą w pierwszym poście napisałeś:

Form1->Edit1->Text = "Jakis teks";

więc Frame z przykładu to Form1

0

Napisalem cos takiego:

//moj plik z oknem formy wywolujacej dll
#include "forma1.h" 
.....
typedef TForm* PForm;
void Funkcja_W_DLL(PForm Form1);
....
//Wywoalnie funkcji w progamie glownym
Funkcja_W_DLL(Form1);
.....
//Funkcja
void Funkcja_W_DLL(PForm Form1)
{

  TEdit *pEdit = (TEdit*)Form1->FindComponent("Edit1");
  if (pEdit)pEdit->Text = "nowy tekst";

}

Ale nie dziala mi to i mam blad:
[Linker Error] Unresolved external '_Form1' referenced from D:\PROJEKTY\C++\PROJEKTY2006\HAK KLAWIATURY\KLAWIATURA1.OBJ

0
nowyjar napisał(a)

\HAK KLAWIATURY\

No to żeś pokomplikował sprawę. Trzeba było od razu pisać, że to ma być hook bo każdy hook wywoływany jest w przestrzeni adresowej procesu, dla którego generowane jest zdarzenie. Dlatego IMO taki kod Ci nie zadziała. Wpierw musisz znaleźć swój program.

0

Chce zeby biblioteka hook w czasie wciskania przycisku zwracala mi do formy wcisniety przycisk.
Potrzebuje do laptopa zrobic zamiane przyciskow, bo mam francuska klawiature.
W formie glownej wybieralbym jakie przyciski chce zamienic, a biblioteka wysylalaby do pola edit wcisniety przycisk, zeby mozna go bylo wybrac do zamiany.

1 użytkowników online, w tym zalogowanych: 0, gości: 1