Конференция "WinAPI" » Динамическая загрузка DLL
 
  • Vidog © (30.11.10 19:04) [0]
    Здравствуйте.

    Хочется узнать, есть ли способ получить список всех export'нутых функций и процедур из DLL и списком параметров к ним с указанием типа параметра + тип результата функции.

    Например:

    type
     TDLLFunctionParam = record
       Name: String;
       pType: String;
     end;

     TDLLFunctionParams = array of TDLLFunctionParam;

     TDLLFunction = record
       Name: String;
       Params: TDLLFunctionParams;
       Result: TDLLFunctionParam;
     end;

     TDLLFunctions = array of TDLLFunction;

    var
    h: HWND;
    fs: TDLLFunctions;
    begin
    h := LoadLibrary('C:\mylib.dll');
    fs := getLibraryFunctions(h);
    end;



    и затем вызвать любую функцию и получить результат:


    var
    h: HWND;
    fs: TDLLFunctions;
    f: TDLLFunction;
    s: String;
    begin
     h := LoadLibrary('C:\mylib.dll');
     fs := getLibraryFunctions(h);
     f := fs[0];
     s := callLibraryFunction(h, f, ['a', '1', '1.2']);
    end;



    то есть я передаю handle библиотеки, функцию и массив строковых параметров, получаю строковой результат в S

    Или нужно заранее знать имена всех функций и четко предопределять параметры?
    Вызывая GetProcAddress(Module: THandle; ProcName: PChar);
  • Игорь Шевченко © (30.11.10 20:05) [1]

    > Или нужно заранее знать имена всех функций и четко предопределять
    > параметры?


    да
  • Vidog © (30.11.10 20:34) [2]
    А если я заведомо знаю имена функций и кол-во параметров, функцию braryFunction(h, f, ['a', '1', '1.2']); можно будет использовать?.. Или я пролетел вообще?)
  • Leonid Troyanovsky © (30.11.10 21:27) [3]

    > Vidog ©   (30.11.10 20:34) [2]

    > А если я заведомо знаю имена функций и кол-во параметров,
    >  функцию braryFunction(h, f, ['a', '1', '1.2']); можно будет
    > использовать?.. Или я пролетел вообще?)

    А с какого вдруг пуркуа длл?

    See also: varargs directive.

    --
    Regards, LVT.
  • Игорь Шевченко © (01.12.10 00:34) [4]

    > А если я заведомо знаю имена функций и кол-во параметров,
    >  функцию braryFunction(h, f, ['a', '1', '1.2']); можно будет
    > использовать?.. Или я пролетел вообще?)


    можно
  • Vidog © (01.12.10 22:02) [5]
    2 Игорь Шевченко
    >>можно

    подскажите, пожалуйста.
  • Leonid Troyanovsky © (01.12.10 23:02) [6]

    > Vidog ©   (01.12.10 22:02) [5]

    > подскажите, пожалуйста.

    Готов подсказать, если пользование длл обоснованно.

    --
    Regards, LVT.
  • Игорь Шевченко © (02.12.10 10:13) [7]

    > подскажите, пожалуйста.


    что подсказать ?
  • Vidog © (02.12.10 18:20) [8]

    > что подсказать ?


    каким образом можно реализовать вот это:
    s := callLibraryFunction(h, f, ['a', '1', '1.2']);


    из части кода. желательно на WinAPI. Куда копать, что почитать :)
  • Игорь Шевченко © (02.12.10 18:31) [9]

    > из части кода. желательно на WinAPI. Куда копать, что почитать
    > :)


    http://www.delphi-jedi.org раздел API Tranlsation
    например почитать
  • Vidog © (02.12.10 20:47) [10]
    >>dlopen
    я в ту сторону копаю?)
  • Vidog © (02.12.10 20:47) [11]

    > http://www.delphi-jedi.org раздел API Tranlsation например
    > почитать

    Спасибо большое за информацию.
  • Vidog © (02.12.10 21:06) [12]

    function test(a, b, c: String): String;
    begin
     Result := '[' + a + ']' + '[' + b + ']' + '[' + c + ']';
    end;

    exports test;



    Вот такая в DLL тестовая функция с 3мя параметрами.


    var
     modl: TModuleHandle;
     P: Pointer;
     S: String;
    begin
     LoadModule(modl, 'Project1.dll');
     P := GetModuleSymbol(modl, 'test');
     S := 'qwe-qwe-qwe';
     WriteModuleData(modl, 'test', S, sizeOf(S));
    end;



    насколько я понял, передать данные можно через WriteModuleData, а прочитать потом через ReadModuleData.

    Так вот.. Каким образом передать 3 параметра? Выполнить функцию 3 раза? Каждый раз записывая параметр. Или я вообще не туда полез...
  • Сергей М. © (02.12.10 23:25) [13]

    > LoadModule


    > WriteModuleData


    Это вообще из какой оперы ?
  • Vidog © (03.12.10 09:48) [14]

    > Это вообще из какой оперы ?


    moduleloader.pas

    =/ что-то у меня ничего не получается...
  • Leonid Troyanovsky © (03.12.10 17:54) [15]

    > Vidog ©   (03.12.10 09:48) [14]

    Что ты испод нас хочешь?

    --
    Regards, LVT.
  • Сергей М. © (03.12.10 20:49) [16]

    > Vidog ©   (03.12.10 09:48) [14]
    >
    >
    > > Это вообще из какой оперы ?
    >
    >
    > moduleloader.pas
    >


    Какой еще нахрен "moduleloader.pas" ?
    Нет такого юнита в составе штатных дельфийских юнитов.
    По кр.мере - в Д7.
  • Leonid Troyanovsky © (03.12.10 22:42) [17]

    > Сергей М. ©   (03.12.10 20:49) [16]

    > Какой еще нахрен "moduleloader.pas" ?

    М.б. by JEDI?

    Хотя, конечно, проще отрубить ему голову.

    --
    Regards, LVT.
  • Vidog © (05.12.10 22:23) [18]

    > Какой еще нахрен "moduleloader.pas" ?


    из JEDI библиотеки..

    Мужики, ну спасайте) Дайте хоть ссылочку на пример или какие использовать модули / функции.
  • Сергей М. © (05.12.10 23:28) [19]

    > Vidog ©   (05.12.10 22:23) [18]


    Посмотрел.

    Этот самый moduleoader не имеет никакого отношения к тому что тебе нужно.

    А то что тебе нужно, т.е.

    > спискоr параметров к ним с указанием типа параметра + тип результата функции

    гарантированно на 100% в ран-тайм можно получить только в отдельных частных случаях. В прочих случаях, не относящихся к этим самым "частным", задача в ран-тайм практически не решаема.
 
Конференция "WinAPI" » Динамическая загрузка DLL
Есть новые Нет новых   [134431   +10][b:0][p:0.002]