Delphi DLL procedura z różnymi zmiennymi

0

Zadeklarowałem sobie procedurę wczytywaną z biblioteki:

type
TDynamic_procedure = procedure(x,y:Integer); cdecl;

private
DynamicProcedure: TDynamic_procedure;

wczytuję ją poprzez:
pointer(DynamicProcedure):= GetProcedureAddress(...);

i wywołuję po prostu tak:
DynamicProcedure(987,654);

Czy jest jakiś sposób na to, żeby zadeklarować procedurę w ten sposób, żeby dało się wywołać z biblioteki dowolną procedurę o dowolnej liczbie zmiennych?

próbowałem deklarować więcej TDynamic_procedure = procedure(x,y,z:Integer;a,b,c:String); cdecl;
i wywoływać np tak: DynamicProcedure(987,654,null,'fuck',null,null);
no ale oczywiście nie działa.

da się to jakoś zrobić?

0

zarówno typ jak i ilość parametrów musi być znana. Inna sprawa, że można przekazać np. array of variant

0

Czy jest jakiś sposób na to, żeby zadeklarować procedurę w ten sposób, żeby dało się wywołać z biblioteki dowolną procedurę o dowolnej liczbie zmiennych?

jeśli chodzi ci o coś takiego, jak w C/C++ ma np. funkcja printf, to się da:

{$apptype console}

function printf(fmt:pansichar):integer; cdecl; varargs; external 'msvcrt.dll';

const endl = #13#10;

begin
  printf('Ala ma kota'+endl);
  printf('Ala ma %d kotów'+endl, 5);
  printf('Hello, %s %d'+endl, 'world', 123123);
end.

Oprócz tego zainteresuj się konstrukcją array of const.

PS. funkcja o konwencji cdecl łyknie wszystko co jej wrzucimy:

{$apptype console}
function printf_a(fmt:pansichar; p1:integer):integer; cdecl; external 'msvcrt.dll' name 'printf';
function printf_b(fmt:pansichar; p1,p2:integer):integer; cdecl; external 'msvcrt.dll' name 'printf';
function printf_c(fmt:pansichar; p1,p2,p3:integer):integer; cdecl; external 'msvcrt.dll' name 'printf';

const endl = #13#10;

begin
  printf_a('jedna liczba %d'+endl, 2);
  printf_b('dwie liczby %d %d'+endl, 2, 3);
  printf_c('trzy liczby %d %d %d'+endl, 2, 3, 4);
end.

Dla uproszczenia użyłem statycznego ładowania. Poeksperymentuj z dynamicznym.

PS2. tak, poprzez msvcrt.dll (jest to standardowa biblioteka windowsa) mamy dostęp do całej biblioteki standardowej C.

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