Задать вопрос
Профиль пользователя заблокирован сроком «навсегда» без указания причины
Ответы пользователя по тегу DLL
  • Cозданиe DLL для Windows с помощью MinGW

    @MikhailEdoshin
    Насколько я понимаю, суффиксы @8 и т. п. добавляются к функциям, для которых указан формат вызовов stdcall и означают размер стека. Это зависит от компилятора вообще-то, но и MSVC, и mingw тут совпадают. Если такую функцию предполагается экспортировать из получившейся DLL, дополнительно создается алиас без суффикса, что мы, собственно, тут и видим:

    DllCanUnloadNow = @ILT+450(_DllCanUnloadNow@0)
    

    Мне не нравится различие в DllMain@8 и @12, правильное, судя по спецификации, @12 — передаются три указателя, но тут один куда-то девается. У вас DllMain точно три параметра принимает?
    Ответ написан
  • Подключение dll к проекту Visual Studio 2010 (C++)

    @MikhailEdoshin
    Нужно сделать .lib-файл самостоятельно. Посмотрите, нет ли в комплекте с .dll файла .def. Если есть, то можно получить .lib с помощью

    lib.exe /DEF:mylib.def mylib.dll

    или

    lib.exe /DEF:mylib.def /OUT:mylibname.lib mylib.dll

    если нужно другое имя. В таком виде (dll + def), распространяется, например, sqlite3.

    Если .def-файла нет, посмотрите, какие у вас символы в библиотеке через

    dumpbin /exports mylib.dll

    Если это практически те же имена, что и в заголовочном файле, значит, библиотека экспортирует символы в стиле С; это хорошо. Перечислите все нужные имена в командной строке:

    lib.exe /EXPORT:mylib_func1 /EXPORT:mylib_func2 mylib.dll

    (.def-файл, по сути, делает то же самое.) Единственное, я сейчас не помню, но к именам может спереди добавлятся подчеркивание. Я не уверен, нужно ли указывать имена с подчеркиванием или без.

    Если там имен нет, значит, они отрезаны, функции можно определить только по порядковому номеру. Если вокруг них всякая муть, это C++, а муть означает закодированный тип параметров. Это все не очень хорошо, конечно, потому что соответствие номеров функциям не определить (разве что экспериментально), а стандарта на кодирование нет. Но технически создать .lib-файл можно, у опции /EXPORT полная сигнатура такая:

    /EXPORT: entryname[= internalname][,@ ordinal[, NONAME]][, DATA]

    То есть можно и переименовать функцию, и по номеру ее выбрать, и данные экспортировать. Но это на крайний случай.

    lib.exe обычно не в PATH, из обычной командной строки не найдется, но в группе инструментов Visual Studio должно быть что-то вроде «Command Prompt» — он открывает консоль и добавляет нужные пути в PATH, так что инструменты командной строки становятся доступными.

    Ссылки: dumpbin, lib.
    Ответ написан
  • MFC в «обычной» Win32 DLL и DLLMain?

    @MikhailEdoshin Автор вопроса
    Сам и отвечу — судя по всему, встраивается MFC-ный DllMain, включать нужно afxwin.h изменения примерно как я и пишу, только ExitInstance() возвращает int. Конструктор на всякий случай сделал пустой, как в примерах, зачем это нужно в C++ мне всё равно не понять.
    Ответ написан
    Комментировать
  • Надо сделать dll на python. Где почитать?

    @MikhailEdoshin
    И вот еще, кстати, заметка Implementing dynamic DLLs in Python; как видно из заметки, готового решения нет, хотя вроде бы как технически возможно написать один шаблон, который затем «просто» получал бы список функций и делал бы из этого DLL.
    Ответ написан
    Комментировать
  • Надо сделать dll на python. Где почитать?

    @MikhailEdoshin
    Простого способа нет, но можно написать обертку на C, которая загружает модуль и экспортирует нужные функции. Модуль можно хранить в виде исходного текста прямо в коде. Для работы в общем случае потребуется инсталлированный Python, или, по меньшей мере, PythonNN.dll, и нужные модули из стандартной библиотеки (тоже встроенные в код). Есть утилита py2exe, которая примерно таким образом делает .exe-файл.
    Ответ написан
    2 комментария
  • Программа на Qt крушится при многократном использовании функции из DLL

    @MikhailEdoshin
    Я бы попробовал __stdcall объявить и в typedef?
    Ответ написан
    Комментировать