Komunikacja dll -> aplikacja

0

Witam!
Przekopalem cale forum, ale nic nie znalazlem :(. A problem jest nastepujacy:
Wywoluje z poziomu aplikacji biblioteke dll, ona uruchamia sie i chcialbym zeby przeslala wynik konkretnej operacji do np. listboxa na formatce aplikacji ktora ja wywoluje ...
Niby nic wielkiego, ale dla mnie to niezly zonk.... :(

0

moze dodaj do funkcji argument w postaci uchwytu do tej kontrolki?

0

A może po prostu zrób funkcję, a potem przypisujesz w swoim programie listboxowi wynik działania tej funkcji?

ListBox.Items.Add(FunkcjaZDLL(parametry)); ?

0

Sprawa uchwytu do kontrolki na razie odpada... nie wiem za bardzo jak to zrobic (jeszcze :-/ ) Wiec postanowilem zrobic to na funkcji. Jak postanowilem, tak zadzialalem cos takiego:

  
void __stdcall TestDLL(AnsiString result)
  {
  result="Hello! from my.dll";
  }

To w dll-ce, a w kodzie programu tak:

 {         AnsiString result; //co by nie miec problemow z typami...
           _RunThisModule();
           Loader->ListBox1->Items->Add(TestDLL(result));
 }

No i niby ok, tylko ze kompilator sypie mi bledy ktorych nie rozumiem (nie to ze nie wiem co pisze ... wiem tylko nie wiem czemu sie sypie... [???] )

[C++ Error] XPTool_LOADER.cpp(44): E2227 Extra parameter in call to __stdcall TestDLL()
[C++ Error] XPTool_LOADER.cpp(44): E2034 Cannot convert 'void' to 'AnsiString'
[C++ Error] XPTool_LOADER.cpp(44): E2342 Type mismatch in parameter 'S' (wanted 'const AnsiString', got 'void')

Dlaczego wskakuje to jako void? przeciez w dll-ce i w funkcji zrobilem AnsiString.
A tego pierwszego bledu zupelnie nie kumam... :(

0

Ty się naucz podstaw języka, dopiero potem zastanawiaj sie jak używać dll-ek.

0

Oj ucze sie ... :) I to w dodatku w kazdy mozliwy sposob, bez wzgledu czy to na wlasnych bledach czy nie... Poza tym, wydaje mi sie ze forum jest wlasnie od tego zeby uczyc i wskazywac droge, jak ktos sie zamota ... jak sie znowu myle to mnie sprostuj, jak nie, to sie albo nie odzywaj, albo pokaz co robie zle ... O ile sam to wiesz.

0

Użyj referencji (parametr funkcji) + logiki i będzie git ;P

0

Najprosciej bedzie jak funckcja bedzie zwracac rezultat - tylko radze uzyc

char*

zamiast AnsiString

0

Proszę:

Loader->ListBox1->Items->Add(TestDLL(result));

TestDLL musi tutaj zwrócić jakąś wartość. Pisząc w ten sposób, nie zmieni się nic, nawet zmienna result, ani nie zwrócisz żadnej wartości.
Błąd tkwi w ciele funkcji TestDLL:

void __stdcall TestDLL(AnsiString result)
{
    result="Hello! from my.dll";
}

Aby cokolwiek funkcja mogła zwrócić :) musisz to zadeklarować, czyli napisać np:

AnsiString __stdcall TestDLL()

typ void oznacza tu że funkcja nie zwraca nic.

Potem nie piszesz

result="abc"

(jak w delphi, bo podejżewam, że chcesz się przestawić z delphi na bcb) tylko:

return "abc"

Czyli funkcja w rezultacie będzie wyglądać następująco:

AnsiString __stdcall TestDLL()
{
    return "Hello! from my.dll";
}

Oczywiście musisz ją wywoływać bez parametru.

Sorry, jeśli opis jest dla ciebie zawiły, ale nie potrafię tego lepiej wytłumaczyć - nie jestem dobrym nauczycielem :).

0

huh... bylo od razu, ze w builderze smigasz :)
to umiesc w bibliotece:

extern "C" __declspec(dllexport) void __stdcall RunThisModule(TListBox* ListBox);
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    return 1;
}
//---------------------------------------------------------------------------

void __stdcall RunThisModule(TListBox* ListBox) {
   ListBox->Items->Add("item");
}

to w pliku naglowkowym projektu:

typedef void __stdcall (*PROCRunThisModule)(TListBox* ListBox);

prze deklaracja formy

a to w programie

HINSTANCE NaszDLL;
   NaszDLL = LoadLibrary("DLL.dll");
   if (NaszDLL == NULL)
   {
      Application->MessageBox("Nie można załadować Biblioteki dll!", "Błąd",                               MB_OK | MB_ICONHAND);
   }
   else
   {
      PROCRunThisModule RunThisModule =
         (PROCRunThisModule)GetProcAddress(NaszDLL, "RunThisModule");
      if (RunThisModule == NULL)
      {
         Application->MessageBox("Nie znalazłem zdefiniowanej funkcji!", "Błąd",
                                 MB_OK | MB_ICONHAND);
      }
      else
      {
         RunThisModule(ListBox1);
      }
   }
0

maxbog - racja ... za duzo object pascala, przyzwyczajen mi sie w glowie jeszcze kupe poniewiera [wstyd] Sorki za to warkniecie ( to u mnie naturalne jak drapanie za uchem :), przeciez buras jestem). Fakt, w ciele z tym rezultatem ogona dalem ...
vixen03 - oj jeszcze nie smigam :D
Ale jak bedzie wiecej na tym forum ludziskow ktorzy, jak chca to potrafia pomoc, to nie wykluczone ze kiedys bede ... chociaz za malo czasu programowaniu niestety moge poswiecic :(

Dzieki wszystkim ludziskom za pomoc :D
No i tak jeszcze bede Was nekal glupimi pytaniami :D

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