1

Тема: DLL виклики функцiй

Пiдкажiть якийсь туториал як зробити dll яка може викликати функции программи.
Программа може викликати функции dll.
I власне як той dll пiдключити ?
LoadLibrary ?

2

Re: DLL виклики функцiй

та ні, якась є АРІ от очно не згадаю, ShellExecuteякось так, а так можна взяти з прикладу

rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,0

ну і почитати за rundll32.exe

Подякували: Fox1

3

Re: DLL виклики функцiй

Як підключати ЛЮА докладно описано в .... несподіванка... документації по ЛЮА. Підключення ДЛЛ бувають динамічні (LoadLibrary/GetProcAddress)та статичні (з секції імпорту), але ви того не побачите тільки опції компілера та хідери до сів. Повна документація по ВінАпі та форматам файлів є знову ж таки... несподівано... приготуватися.... в манах од майкрософта, MSDN'ом зветься.

4 Востаннє редагувалося Torbins (17.02.2017 18:41:21)

Re: DLL виклики функцiй

vtorgashov написав:

Пiдкажiть якийсь туториал як зробити dll яка може викликати функции программи.
Программа може викликати функции dll.

Гляньте як в MSDN реалізована робота з калбеками. А отут можете глянути про плагіни в Делфі: http://www.gunsmoker.ru/2011/12/delphi.html У вас суть буде та сама. Ви завантажуєте бібліотеку і передаєте їй список посилань на функції, які бібліотека може викликати. В свою чергу бібліотека віддає вам список своїх функцій, які ви маєте викликати при настанні певних подій. Для зручності ці списки можна оформити у інтерфейси (увесь COM тягнути не обов'язково).
Там далі описана робота з GUI, але той підхід можна застосовувати лише якщо з інтерфейсом плагін працює мало. Якщо ж плагіну треба дати можливість глибоко інтегруватися в інтерфейс проги, то, на мій погляд, без скриптового двигуна не обійтися. Скрипти будуть керувати графічними елементами, а коли треба виконати якусь важку дію, викликатимуть функції з плагіна.

5 Востаннє редагувалося Yola (18.02.2017 16:50:45)

Re: DLL виклики функцiй

Ось приклад:

    void FbxImporter::Init() {
        m_Library = ::LoadLibrary(IMPORTER_NAME);
    }

    void FbxImporter::Close() {
        if (m_Library) {
            ::FreeLibrary(m_Library);
            m_Library = NULL;
        }

    const FBX::Scene* FbxImporter::GetScene(const char *filename) {
        pfnLoadFbxFile *LoadFbxFile = (pfnLoadFbxFile*)::GetProcAddress(m_Library, "LoadFbxFile");
        return LoadFbxFile(filename);
    }

    void FbxImporter::DeleteScene(FBX::Scene *scene)
    {
        pfnFreeScene *FreeScene = (pfnFreeScene*)::GetProcAddress(m_Library, "FreeScene");
        FreeScene(scene);
    }

Ось це в самій dll, але якщо ви не свою dll використовуєте, то типи для функцій вам будуть відомі зі специфікації.

typedef DLL_FUNC const FBX::Scene * (pfnLoadFbxFile)(const char *fbxFilename);
typedef DLL_FUNC void (pfnFreeScene)(const FBX::Scene *scene);
extern "C" DLL_FUNC const FBX::Scene *LoadFbxFile(const char *fbxFilename);
extern "C" DLL_FUNC void FreeScene(const FBX::Scene *scene);