type = Procedure()

0

Witam!
Dawno nie programowałem w Delphi, a teraz muszę na szybko napisać coś z użyciem zewnętrznych DLL.
Problem mam z tym, że jest tam takie wywołanie procedury:

Function XXX(poczatek, koniec:Word; Proc TEnumTrans): BOOL; stdcall;

typ mam zdefiniowany tak:

type TEnumTrans = Procedure(ilosc: Word; const Info: TInnyTyp); stdcall;

(TInnnyTyp nie jest już ważny)

Dwa pytania:

  1. Jak takie cudo wywołać?
  2. Jak takie cudo przepisać do C#? :)

z góry dzięki

pozdrawiaMM

0

C# - słówko kluczowe extern
Delphi - wszystko znajdziesz w pomocy lub w Kompendium :)

0

Jezeli masz

type TEnumTrans = Procedure(ilosc: Word; const Info: TInnyTyp); stdcall;

to gdzieś musisz mieć zmienną która jest typu TEnumTrans np.

var
funkcjaX: TEnumTrans;

i wywolujesz potem funkcje normalnie
funkcjaX(1,itNone);

W .NET bedzie analogicznie jezeli to ma być zrobione dynamicznie jak w Delphi to musisz zadeklarować znianną typu funkcja i przypisać jej adres z DLL
ewentualnie DllImport(...)
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx

0

OK, może źle się wyraziłem. Chodzi mi o wywołanie XXX. Tej, której parametrem jest Proc...

0

Ah dobra, się rozpiszę :p
Są dwa sposoby ładowania DLL, dynamiczny i statyczny, dynamiczny używasz kiedy potrzebujesz tylko wywołać jedną metodą z dll i tyle, statyczny używasz gdy wołasz więcej metod, gdy dll trzyma w sobie dane generowane przez peirwszą funkcję a używane przez drugą ( naprzykład gdy dll jest pluginem )
Używa się metod z WinAPI, nazwy chodza coś koło LoadLibrary ( ładowanie statyczne ) i GetProcAdress ( to chyba do obu ), z tego co pamiętam to w helpie Delphi 7 wszystko było łądnie opisane, wraz z przykładami, można też dołączyć metodę "na sztywno", słuwko kluczowe external ( to też jest opisane i w helpie i w Kompendium )

W C# robisz coś w stylu:

[DllImport("kernel32", SetLastError=true)]
static extern bool CreateDirectory(string name, SecurityAttribute sa);

Powiedz co dokładnie chcesz zrobić to jakoś dokładniej odpowiem :p

0

Jak zaimportować procedury i typy w C# wiem. Chodzi mi o konkretny przypadek - gdy parametrem jest procedura. Nawet w delphi nie potrafię tego prawidłowo wywołać. Chodzi mi o wywołanie metody XXX z parametrem typu TEnumTrans. Kolejnym problemem (być może) będzie przepisanie tego do C#. (albo pozostanę przy Delphi)

0
type MyProc = procedure(AnotherProc a);
var proc1:MyProc;
procedure foo(ProcAddr:Pointer)
begin
  proc1:=ProcAddr;
end;
0

gdzieś w kodzie

procedure Dupa(ilosc: Word; const Info: TInnyTyp); stdcall;
begin
  //cokolwiek ma się dziać niech się dzieje
end;

i dalej

var
  p, k: Word;
begin
  if XXX(p, k, @Dupa) then
  ...
end;

poczytaj sobie o funkcjach zwrotnych w delphi (callback function)

0

@Misekd: pisałem z pamięci :p

0

Czy przez przepisanie masz na mysli calkowite przejscie na C# (z zapomnieniem Delphi) czy o próbe eksportu takiej funkcji pod delphi celem wywolania spod C# (albo odwrotnie)?

generalnie w C# sa delegaty albo jeszcze lepiej lambdy.

0

Zapomniałem, że i tak będę musiał zrobić to w Delphi, bo to COM ma być... Więc temat C# odpada, choć już częściowo zrobiłem...

0

bo to COM ma być
przecież C# daje dostęp do COM

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