Jak powiązać *.dll z moim programem?

Jak powiązać *.dll z moim programem?
DC
  • Rejestracja:około 13 lat
  • Ostatnio:około rok
  • Postów:145
0

Witam.

Chciałbym, aby mój program był bardziej kompatybilny z moim *dll. Napisałem pewien kod i by zobaczyć czy działa dodałem do niego coś takiego:

Kopiuj
if result = 1 then
Raise Exception.Create(Format('Incorrect Message found at: %0:.8x', [Int64(Mbi.BaseAddress) + i]));

Działa to jak należy, jednak chciałbym, by mój program był wstanie z tego skorzystać. Chodzi o to jakby, że nie chcę by tylko i wyłącznie pojawiało się okienko z informacją. Chciałbym pójść krok dalej i osiągnąć coś takiego, żeby jakaś wartość w moim programie się zmieniała - coś tego typu: Form1.Label1.Caption := '1'; lub po prostu żeby mój program mógł przetworzyć result z *dll i gdy on wynosi "1" to coś zrobić dalej.

Dzięki.

edytowany 3x, ostatnio: Riddle
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:8 dni
0

if result = 1 then Form1.Label1.Caption := '1';


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
ZD
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
2

@DroniC:

Bosch ... jakim cudem się ty wziąłeś przy tych DLL, toż nie tylko nie umiesz podstawowego kodu napisać, ale i otwartym językiem opisać jego specyfikacji.

Bardziej użyteczne będzie zacząć od początku, a nie od końca, wtedy się coś nauczysz...


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
edytowany 1x, ostatnio: ZrobieDobrze
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:39 minut
  • Lokalizacja:Tuchów
  • Postów:12175
4

@ZrobieDobrze: ogarnij no się i nie naśmiewaj się z kogoś, tylko dlatego, że czegoś nie wie. Jeśli masz jedynie nabijać się bądź stękać, zamiast udzielać sensownych rad, to lepiej odpuść sobie pisanie postów.

DroniC napisał(a):

Chodzi o to jakby, że nie chcę by tylko i wyłącznie pojawiało się okienko z informacją. Chciałbym pójść krok dalej i osiągnąć coś takiego, żeby jakaś wartość w moim programie się zmieniała - coś tego typu: Form1.Label1.Caption := '1'; lub po prostu żeby mój program mógł przetworzyć result z *dll i gdy on wynosi "1" to coś zrobić dalej.

Aby funkcja z DLL mogła cokolwiek zmienić w danych, które posiadasz po stronie aplikacji, musisz dać jej taką możliwość. Możesz przekazać dane w parametrach funkcji z biblioteki (przekazanie przez referencję, czyli z var/out), możesz też przekazać wskaźniki (zwykłe wskaźniki lub referencje).

Z wyjątkami uważaj, bo mogą sprawiać problemy w połączeniu z DLL. Lepiej po prostu zwracaj z funkcji bibliotecznej wartość logiczną określającą powodzenie wykonania operacji lub liczbowy kod błędu, tak jak robią to np. funkcje z Win32 API. Wyjątki to ogólnie zło, ale taka jest od dawna moda — co zrobić.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 4x, ostatnio: flowCRANE
DC
  • Rejestracja:około 13 lat
  • Ostatnio:około rok
  • Postów:145
0

No właśnie jak działałem z wątkami to wystarczyło wpisać "unit1" do uses i to ze Sobą współgrało. Z DLL jest zupełnie inaczej i dlatego właśnie nie działa mi to: if result = 1 then Form1.Label1.Caption := '1'

edytowany 1x, ostatnio: DroniC
flowCRANE
Pisałem o wyjątkach, nie o wątkach. ;)
Robert Karpiński
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad rok
  • Postów:133
2

Mówiąc szczerze mało wiemy o tym co już masz zrobione i trudno np. mi osobiście cokolwiek Ci poradzić.
Nie wiem czy już jakąś dll napisałeś czy po prostu chcesz sprawdzić te "dll" i dopiero zaczynasz.

Ale jak zawsze najlepiej zacząć od początku - czyli teorii.
Jest fajny materiał na tym forum - przeczytaj :)

https://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_10

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:39 minut
  • Lokalizacja:Tuchów
  • Postów:12175
3
DroniC napisał(a):

No właśnie jak działałem z wątkami to wystarczyło wpisać "unit1" do uses i to ze Sobą współgrało. Z DLL jest zupełnie inaczej i dlatego właśnie nie działa mi to: if result = 1 then Form1.Label1.Caption := '1'

Biblioteka DLL jest osobnym bytem, niepowiązanym z żadną aplikacją. Jej kod nie może być przystosowany do konkretnego programu, bo one z założenia mają być niezależne zarówno od języka programu-klienta, jak i od jego specyfiki. To co znajduje się w DLL, ma być uniwersalne, możliwe do użycia w połączeniu z dowolnym programem.

Jeśli Twoja biblioteka nie jest przeznaczona do użytku z dowolnymi językami programowania i dowolnymi programami, to jej po prostu nie używaj, a wymaganą logikę pisz bezpośrednio w kodzie projektu aplikacji. Czyli po prostu nie używaj czegoś, czego nie potrzebujesz.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 4x, ostatnio: flowCRANE

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.