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.... :(
moze dodaj do funkcji argument w postaci uchwytu do tej kontrolki?
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)); ?
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... :(
Ty się naucz podstaw języka, dopiero potem zastanawiaj sie jak używać dll-ek.
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.
Użyj referencji (parametr funkcji) + logiki i będzie git ;P
Najprosciej bedzie jak funckcja bedzie zwracac rezultat - tylko radze uzyc
char*
zamiast AnsiString
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 :).
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);
}
}
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