Как сделать файл dll из txt

Обновлено: 01.07.2024

DLL — это библиотеки с динамическим подключением, что означает, что они связаны с вашей программой во время выполнения, а не во время сборки. DLL состоит из трех частей:

код и данные

библиотека импорта

Код и данные — это те части, которые вы пишете: функции, переменные и т. д. Все они объединяются вместе, как если бы вы создавали один большой объектный файл, и помещаются в dll. Они вообще не помещаются в ваш .exe.

Экспорт содержит список функций и переменных, которые dll делает доступными для других программ. Думайте об этом как о списке «глобальных» символов, остальные скрыты. Обычно вы создаете этот список вручную с помощью текстового редактора, но это можно сделать автоматически из списка функций в вашем коде. Программа dlltool создает раздел экспорта dll из вашего текстового файла экспортированных символов.

Библиотека импорта представляет собой обычную UNIX-подобную библиотеку .a, но она содержит только крошечную часть информации, необходимой для того, чтобы сообщить ОС, как ваша программа взаимодействует с dll ("импортирует"). Эта информация связана с вашим .exe . Это также генерируется dlltool .

Создание библиотек DLL

Давайте рассмотрим простой пример создания dll. В этом примере мы будем использовать один файл myprog.c для программы ( myprog.exe ) и один файл mydll.c для содержимого dll ( mydll.dll ).

К счастью, с последними версиями gcc и binutils процесс сборки dll теперь довольно прост. Допустим, вы хотите создать эту минимальную функцию в mydll.c:

Сначала скомпилируйте mydll.c в объектный код:

Затем сообщите gcc, что он создает общую библиотеку:

Вот оно! Чтобы закончить пример, теперь вы можете связать dll с помощью простой программы:

Затем свяжите свою dll с помощью команды, например:

Однако, если вы создаете dll в качестве библиотеки экспорта, вам, вероятно, потребуется использовать полный синтаксис:

Имя вашей библиотеки — $ с префиксом cyg для DLL и lib для библиотеки импорта. Библиотеки Cygwin используют префикс cyg, чтобы отличить их от собственных библиотек DLL MinGW для Windows. Дополнительные сведения см. на веб-сайте MinGW. $ — это все ваши объектные файлы, объединенные в статические библиотеки или отдельные объектные файлы, а $ — это импортные библиотеки, с которыми вам нужно связать, например, '-lpng -lz -L/usr/local/special -lmyspeciallib' .

Связывание с DLL

Если у вас уже есть DLL, вам нужно создать библиотеку импорта, совместимую с Cygwin. Если у вас есть исходный код для компиляции DLL, обратитесь к разделу «Создание DLL» для получения подробной информации о сборке gcc для вас. Если у вас нет исходного кода или поставляемой рабочей библиотеки импорта, вы можете получить большую часть пути, создав файл .def с помощью этих команд (вам может потребоваться сделать это в bash, чтобы цитирование работало правильно):

Обратите внимание, что это будет работать, только если DLL не удалена. В противном случае вы получите сообщение об ошибке: «Нет символов в foo.dll».

Получив файл .def, вы можете создать из него библиотеку импорта следующим образом:

Эта статья покажет вам основы создания библиотек DLL с помощью MinGW, а затем связывания с ними в ваших приложениях. Код, который мы создадим здесь, можно будет использовать и в MSVC, поэтому вы или ваши конечные пользователи сможете использовать несколько компиляторов.

Основы DLL

DLL — это тип общей библиотеки, используемой в Microsoft Windows и OS/2, содержащей функции, которые можно повторно использовать в любом приложении, которое хочет их использовать (на самом деле библиотеки DLL могут содержать гораздо больше, чем просто функции, но эта статья о создании библиотек функций). Если у вас есть библиотека foo.dll, содержащая функцию DoWork() , DLL должна экспортировать эту функцию, чтобы ее можно было использовать в приложениях. Аналогичным образом, если приложение bar.exe хочет использовать функцию DoWork() , оно должно импортировать эту функцию из foo.dll ( также можно написать код, который загружает DLL после запуска приложения, вызывает функции из этой DLL, а затем выгружает DLL, когда она больше не нужна — так обычно работают системы плагинов/аддонов). Экспорт и импорт функций довольно прост и требует небольшого количества кода, сопровождаемого правильной командной строкой компоновщика.

Негибкий и неэлегантный способ

Сначала мы создадим DLL, экспортирующую только очень простую функцию, которая складывает два целых числа и возвращает результат. Обратите внимание на атрибут « __declspec(dllexport) » в приведенном ниже коде — это ключ к экспорту функций из DLL, и каждая функция, которую вы хотите экспортировать из DLL, должна быть помечена этим атрибутом (любые внутренние функции, которые не составляют часть вашего API следует оставить как есть). Также обратите внимание на « __cdecl » перед именем функции, который объявляет соглашение о вызовах для функции (см. статью в Википедии о соглашениях о вызовах x86, если вы с ними не знакомы).Соглашение о вызовах по умолчанию для функций C в MinGW — cdecl, но рекомендуется всегда явно указывать соглашение о вызовах на случай, если какой-то другой компилятор использует другое значение по умолчанию — если это произойдет, ваше приложение, скорее всего, будет работать некорректно. или сбой в результате вызова одной из этих функций. Обратите внимание, что этот первый пример намеренно негибкий и неэлегантный, чтобы точно показать, что происходит за кулисами. В следующем разделе мы будем скрывать эти детали с помощью определений препроцессора.

Чтобы скомпилировать это, просто необходимо передать опцию «-shared» в обычную командную строку компоновщика:

Никаких ошибок не должно быть сообщено, и теперь у вас должна быть пригодная для использования библиотека DLL. В этом примере я разделил этапы компиляции и компоновки, хотя для такого небольшого проекта это можно было бы сделать просто с помощью « gcc -o add_basic.dll -s -shared add_basic.c -Wl, --subsystem,windows ». «-Wl,--subsystem,windows» на самом деле не является необходимым, но просто общепринято, что библиотеки DLL имеют подсистему графического интерфейса Windows, указанную в их PE-заголовке. Также обратите внимание, что переключатель «-s» используется для удаления символов из DLL — вы, вероятно, захотите сделать это только для выпускных сборок.

Теперь вы можете создать приложение, использующее эту библиотеку DLL. Все, что необходимо для использования функции Add(a, b), — это объявить функцию с атрибутом «__declspec(dllimport)» перед ее использованием (обратите внимание, что это dllimport для клиентского приложения, в отличие от dllexport, используемого в нашей DLL).

Теперь вы можете скомпилировать и связать это приложение, просто сославшись на нашу DLL в командной строке компоновщика.

Параметр «-L» указывает дополнительную папку, в которой компоновщик должен искать библиотеку DLL. В этом случае мы хотим, чтобы компоновщик выполнял поиск в текущем каталоге, поэтому мы можем просто использовать точку, но для настоящей DLL, которую мы развернули в системе, мы будем использовать полный путь к ее каталогу. Параметр «-l» указывает DLL, из которой мы хотим импортировать функции — это должно быть имя файла DLL без расширения файла. Опять же, для такого небольшого проекта приложение можно было бы скомпилировать и слинковать, выполнив команду gcc -o addtest_basic.exe -s addtest_basic.c -L. -ladd_basic ”

Гибкий и элегантный способ

Обратите внимание, что мы определили «ADDAPI» как «__declspec(dllexport)», если определено «ADD_EXPORTS», или «__declspec(dllimport)» в противном случае. Именно это позволяет нам использовать один и тот же заголовок для приложений и DLL. Также обратите внимание, что мы определили «ADDCALL» как «__cdecl», что позволяет легко переопределить соглашение о вызовах, которое мы используем для нашего API. Теперь в любом месте нашего кода, где нам нужно экспортировать функцию из нашей DLL, мы указываем «ADDAPI» вместо атрибута «__declspec(dllexport)» и «ADDCALL» вместо указания, т. е. «__cdecl». Принято называть эти определения препроцессора «[имя библиотеки]_EXPORTS», «[имя библиотеки]API» и «[имя библиотеки]». ЗВОНИТЕ», поэтому рекомендуется придерживаться этого правила, чтобы ваш код был удобочитаемым для вас и других.

Помните, что этот код нельзя переносить, так как в нем используются атрибуты Microsoft. Здесь это нормально, потому что это руководство по созданию Windows DLL, но если вам нужна межплатформенная совместимость, то ADDAPI и ADDCALL можно определить условно. Обычно это делается так:

Код для DLL теперь может включать только что созданный заголовок, и единственное изменение, которое нам нужно сделать, это включить «ADDCALL» перед именем функции (здесь необходимо указать соглашение о вызовах, чтобы предотвратить возможные конфликты между объявление и определение функции).

Чтобы скомпилировать эту DLL, необходимо определить «ADD_EXPORTS» при компиляции объектного кода, чтобы обеспечить правильное определение «ADDAPI» в заголовке. Проще всего это сделать, передав «-D ADD_EXPORTS» в командной строке:

Для компиляции приложения не требуется никаких изменений в используемой нами командной строке:

Этот процесс сборки используется во многих реальных библиотеках. Если неясно, что происходит с определениями препроцессора, передайте «-save-temps» в командной строке gcc на этапе компиляции и просмотрите файлы с расширением «.i» — вы заметите, что в конечном итоге сгенерированный код как в элегантных, так и в неэлегантных примерах почти одинаково.

Экспорт и импорт переменных

В дополнение к функциям также можно экспортировать и импортировать переменные. Эти переменные должны быть объявлены как «extern __declspec(dllexport)» или «extern __declspec(dllimport)», в зависимости от того, строим ли мы DLL или клиентское приложение с использованием этих переменных. Как и в случае с функциями, мы можем использовать определения нашего препроцессора и просто выделить переменные «extern ADDAPI». Для переменных не следует указывать соглашение о вызовах.

Здесь мы добавили две экспортированные переменные в наш заголовочный файл, foo и bar.

Код DLL теперь включает присвоение значений нашим экспортируемым переменным:

Приложение было изменено таким образом, что теперь оно добавляет импортированные переменные foo и bar вместе, выводя результат:

Если вы измените значения foo и bar, перекомпилируете DLL и снова запустите приложение, вы увидите, что переменные действительно импортированы из DLL.

Импорт библиотек

Хотя обычно можно связать DLL, просто имея DLL в вашей системе и добавив некоторые параметры командной строки компоновщика, это не всегда желательно. В этом случае вместо этого следует использовать библиотеку импорта. Библиотека импорта не содержит кода, но содержит всю необходимую информацию, необходимую вашему приложению для поиска функций, экспортируемых DLL. При создании библиотек для использования третьими лицами я бы рекомендовал всегда создавать библиотеку импорта и распространять ее вместе с вашими файлами DLL и заголовочными файлами, поскольку вашим пользователям может потребоваться создавать свои приложения с использованием библиотек импорта.< /p>

Если вы изменили имена функций, экспортируемых библиотекой DLL (см. «Предупреждение об экспорте функций stdcall» ниже), единственным вариантом является библиотека импорта. Это относится к API Windows, где вы должны связать свои приложения с помощью библиотек импорта, т. е. передать «-lgdi32 -luser32» и т. д. в командной строке компоновщика при компиляции программ с графическим интерфейсом Windows.

Создание и использование библиотеки импорта

Если вы не изменили ни одно из имен функций, экспортируемых DLL, то создание библиотеки импорта — это всего лишь случай передачи дополнительного параметра «-Wl,--out-implib,lib[имя библиотеки ].a ” в командную строку компоновщика.

Принято использовать имя библиотеки в имени библиотеки импорта. Обязательно, чтобы имя файла начиналось с «lib» и заканчивалось расширением «.a», чтобы его можно было использовать (на самом деле есть несколько поддерживаемых соглашений об именах, которые вы можете использовать, которые описаны в руководстве, но все остальное не подходит). не работает).

Сборка приложения такая же, как и раньше, но вместо того, чтобы передавать каталог, содержащий DLL, компоновщику, вместо этого вы передаете каталог, содержащий библиотеку импорта (на самом деле мы все еще делаем все из текущего каталога, но это, вероятно, не было бы случаем для реального приложения). Чтобы связать DLL, вы передаете имя библиотеки импорта без префикса lib и расширения файла.

Обычно библиотеки DLL помещаются в папку с именем «bin», а библиотеки импорта — в папку с именем «lib», например, «C:\Program Files\Add\bin\» и «C:\Program Files\Add\». библиотека\ ".

Предупреждение об экспорте функций стандартного вызова

Одна вещь, о которой вы должны знать при объявлении функций « __stdcall », заключается в том, что MinGW и MSVC экспортируют свои функции с немного разными именами (декорациями функций). Для нашего примера с добавлением выше MSVC экспортирует функцию «Add(int a, int b)» с именем «_Add@8» (подчеркивание, имя функции, знак at, размер аргументов в байтах), тогда как MinGW экспортирует ее. как «Add@8» (то же, что и MSVC, но без подчеркивания). Поэтому, если вы хотите иметь бинарную совместимость между сборками MinGW и MSVC вашей DLL, необходимо изменить имена экспортируемых функций. Это немного сложнее, чем я собираюсь охватить в этой статье, но я написал статью Advanced MinGW DLL Topics, в которой объясняется, как это сделать, а также некоторые подводные камни, на которые следует обратить внимание.

Добавление информации о версии и комментариев к вашей DLL

Если вы просмотрите свойства DLL с помощью проводника Windows и перейдете на вкладку «Подробности», вы, скорее всего, увидите информацию о DLL, такую ​​как версия, автор, авторские права и описание библиотеки. Это приятное прикосновение к DLL (особенно полезно, когда вы хотите знать, какая версия DLL установлена ​​на вашем ПК), и это довольно просто добавить в вашу DLL. Все, что вам нужно сделать, это создать ресурс версии, например следующий:

Я не буду вдаваться в подробности того, что означает каждый из этих элементов, так как они очень хорошо описаны в MSDN, но большая часть из них не требует пояснений (в любом случае я рекомендую прочитать статью MSDN, особенно если язык американский английский или любой другой, кроме британского английского).

Идея состоит в том, чтобы скомпилировать сценарий ресурсов с помощью windres.exe, а затем передать его компоновщику при связывании библиотеки DLL. Например, если ваш ресурсный скрипт называется «resource.rc»:

Это все, что нужно сделать, чтобы добавить информацию о версии в DLL. Стоит потратить время на то, чтобы сделать это для любых DLL, которые вы выпускаете, так как это полезно и придает вашему приложению профессиональный вид.

Собираем все вместе

Используя информацию из этой статьи, вы теперь сможете собрать все воедино и создать библиотеки DLL с помощью MinGW, а также исполняемые файлы, использующие функции, экспортированные из библиотек DLL.Чтобы помочь вам, я создал небольшой проект, который создает DLL со следующими функциями:

  • Экспортировано “ int Add(int a, int b); ”, используя соглашение о вызовах cdecl.
  • Экспортированные переменные «foo» и «bar».
  • Ресурс информации о версии, встроенный в библиотеку DLL.

Кроме того, будет создан исполняемый файл, который выводит результат сложения, используя экспортированную функцию и экспортированные переменные. Проект можно собрать с помощью утилиты mingw32-make.

Вы можете загрузить пример DLL MinGW с GitHub, чтобы создать пример DLL и приложения из этой статьи. Вы можете либо клонировать репозиторий с помощью git, либо загрузить пример выпуска MinGW DLL. Вы можете использовать его для любых целей, которые посчитаете нужными (полные условия использования см. в «License.txt»). Используя файлы проекта, вы можете легко создать пример из этой статьи и использовать его в качестве основы для своих собственных библиотек DLL и приложений.

Что нужно знать

Еще один момент, о котором следует помнить, это то, что если вы передаете структуры в функцию, экспортированную из библиотеки DLL, или возвращаете структуру из этой функции, вы не сможете позже изменить определение этой структуры. Внесение таких изменений, скорее всего, приведет к сбою старых приложений или к непредусмотренному поведению, поскольку расположение памяти структуры изменилось с момента компиляции приложения. Невозможно изменить определение структуры, не нарушая обратной совместимости, но это тоже не элегантно. Например, в Windows API часто бывает, что структуры имеют член (на первый взгляд бессмысленный), который указывает размер структуры, новые члены добавляются в конце определения структуры и передаются в функции по адресу, а не по значению (для пример структуры OPENFILENAME). Это те вещи, которые позволяют Windows API изменяться между выпусками Windows, не нарушая обратной совместимости (я знаю, что люди могут сказать, что каждая версия Windows вызывает много проблем с обратной совместимостью, но факт в том, что хорошо написанное приложение, созданное для Windows 95 имеет хорошие шансы работать на последних версиях Windows, что, на мой взгляд, весьма впечатляет).

Похожие страницы


    Дополнительные темы по созданию библиотек DLL с помощью MinGW, включая классы JNI, P/Invoke и C++.
    Как создать полнофункциональное приложение Windows с графическим интерфейсом с помощью компилятора MinGW.
    Как создавать приложения OpenGL для Windows с помощью библиотек freeglut или GLUT для Win32 и компилятора MinGW.

©2001–2018 Transmission Zero. Все права защищены. Конфиденциальность и файлы cookie.

В этом разделе объясняется процедура создания настраиваемых файлов DLL, которые можно использовать для загрузки в приложение TruCap+.

Необходимые условия для создания DLL

Ниже приведен список предварительных условий, которые пользователь должен выполнить, прежде чем приступить к созданию любого DLL-файла.

Сигнатуры для определения методов

Существует определенный шаблон подписей, которым должен следовать пользователь при создании DLL для методов извлечения и проверки. DLL может содержать методы извлечения или проверки.

Подписи для метода извлечения:

public void ExternalExtractionMethodName(Список wordData, Список фразеданных, Список параметров, ref Список извлеченных результатов)

  • wordData и фразаДанные: это списки уже извлеченных слов и фраз, а также номер строки, координаты X и Y.
    Авторы DLL могут использовать эти данные в своей логике в соответствии с требованиями.
  • параметры: авторы DLL могут определять пользовательские параметры для своих методов. Эти параметры появляются в онтологии во время настройки этих функций. Значения, заданные для этих параметров во время определения онтологии, затем доступны в этом массиве.
  • extractedResults: этот параметр представляет собой список объектов ExtractedValue, и авторы DLL должны возвращать свои результаты в этом списке.

Подписи для метода проверки:

public static bool ExternalValidationMethodName (string args , string trustLevels )

  • args: это извлеченное значение для поля.
  • Уровни достоверности: это уровни достоверности для каждого символа в извлеченных значениях полей.
  • bool: ожидается, что это возвращаемое значение этого метода. Возвращаемое значение true означает, что проверка прошла успешно.

Шаблон проекта

  • Шаблон проекта Visual Studio CustomFunctions.zip предоставляется для использования авторами DLL.
  • Автор DLL должен скопировать этот шаблон в путь к шаблонам Visual Studio.

Поиск пути к шаблону проекта в Visual Studio

  1. Перейдите на страницу Microsoft Visual Studio, выберите Инструменты > Параметры.
  1. Пользователь может записать путь к шаблону проекта, указанный в поле Расположение шаблона проекта пользователя: для справки.

Создание нового проекта с использованием шаблона

  1. В расположении шаблонов проектов Visual Studio пользователю необходимо сначала скопировать файл CustomFunctions.zip.

По умолчанию отображается имя Class1.cs, однако пользователь может изменить имя проекта. Этот файл пользовательских функций содержит примеры реализации методов проверки и извлечения.

    Укажите имя и имя решения, выберите нужное расположение и нажмите кнопку "ОК".
    Код пользовательских функций появится на странице Visual Studio.

Вы можете использовать DLL-файлы библиотеки динамической компоновки в программировании для оптимизации процессов и создания более эффективного кода. Вам нужна специальная программа для открытия и чтения файлов DLL. Хотя вы обычно оставляете файлы DLL в покое, знание того, как открыть и прочитать файл DLL, может помочь вам оптимизировать функции вашего компьютера и программы, которые вы хотите запускать. В этой статье мы обсудим, что такое DLL-файлы, и четыре способа их открытия и чтения.

Что такое файл DLL?

DLL — это тип файла, который позволяет другим программам Windows иметь функции, не включенные в их основную программу. Файлы DLL специфичны для программ Windows, то есть они не будут работать с другими операционными системами. Как правило, вы можете позволить файлам DLL выполнять свои функции, не открывая их, но в некоторых ситуациях вы хотите открыть файл DLL, чтобы упростить процессы программирования или определить, отсутствует ли файл DLL.

Как открыть файлы DLL

Чтобы открыть DLL-файл, выполните следующие действия:

1. Определите использование DLL-файла

Файлы DLL обычно работают в фоновом режиме, когда вы используете программы Windows. Один файл DLL часто может иметь несколько функций, которые он может выполнять, к которым программы могут обращаться для выполнения этой функции. Некоторые функции, которые может иметь файл DLL, включают:

2. Найдите программу, которая может открыть файл DLL, и следуйте инструкциям, чтобы открыть файл

Есть несколько программ, которые могут открыть файл DLL. На компьютерах с Windows уже есть программа реестра, в которой вы можете регистрировать файлы DLL. Visual Studio или декомпилятор — это программы, которые вы можете загрузить для чтения ваших DLL-файлов, а Visual Studio в Интернете позволяет вам просматривать DLL без предварительной загрузки или поиска программы. Ниже приведены четыре метода, которыми вы можете воспользоваться, чтобы открыть файл DLL:

Реестр Microsoft Windows 7 и более поздних версий

Ниже приведены шаги, которые могут помочь вам открыть файл DLL на компьютерах с Windows 7 и более поздних версиях:

Откройте командную строку. Вы можете открыть командную строку, перейдя в меню "Пуск" Windows или нажав сочетание клавиш Windows+R и введя "cmd" в строке, которая появляется на экране.

Откройте папку с файлом DLL. Найдя папку, удерживайте клавишу Shift и щелкните папку правой кнопкой мыши, чтобы открыть командную строку непосредственно в этой папке.

Введите "regsvr32 [имя DLL].dll" и нажмите Enter. Эта функция может добавить файл DLL в реестр Windows, что поможет вам получить доступ к файлу DLL. Вы можете использовать эту функцию для добавления новых файлов DLL на ваш компьютер.

Введите "regsvr32 -u [ имя DLL ] .dll" и нажмите Enter. Эта функция может удалить файл DLL из реестра. Вы можете использовать это для удаления неправильно работающих DLL-файлов.

Microsoft Windows Visual Studio

Загрузите Microsoft Visual Studio. Перед загрузкой программы убедитесь, что ваш компьютер соответствует требованиям для запуска программы. Убедившись, что на вашем компьютере можно запустить программу, запустите программу установки, чтобы добавить ее на свой компьютер.

Откройте папку с файлом DLL и выберите «Экспорт в проект». Вы можете использовать другую программу для просмотра кода и найти что-то, что нужно изменить. Находясь в другой программе, вы можете щелкнуть файл DLL правой кнопкой мыши, чтобы экспортировать его в Visual Studio. Это может взять файл DLL из используемой вами программы и переместить его в Visual Studio.

Отредактируйте код. Используя Visual Studio, вы можете редактировать код для запуска нужных функций. Вы также можете использовать Visual Studio для чтения DLL-файла без редактирования кода.

Visual Studio онлайн

Метод, который вы можете использовать, если на вашем компьютере не установлена ​​Windows Visual Studio, — это Visual Online Studio. Ниже приведены шаги, чтобы открыть файл DLL с помощью онлайн-версии Visual Studio:

Откройте веб-браузер. Использование веб-браузера, который вы обычно используете, может помочь вам более эффективно работать с Visual Studio в Интернете, поскольку вы, возможно, уже знакомы с этим браузером.

Введите веб-адрес Visual Studio. В адресной строке вашего браузера вы можете ввести https://online.visualstudio.com/login, чтобы попасть на сайт. Вы также можете выполнить поиск по термину "визуальная студия онлайн".

Войдите или создайте учетную запись. Чтобы использовать Visual Studio Online, вам может понадобиться зарегистрированная учетная запись Microsoft. Если он у вас уже есть, вы можете войти.

Загрузить DLL-файл.Зайдя в Visual Studio Online, вы можете найти файл DLL в проводнике и загрузить его в программу для чтения и редактирования.

Программа декомпилятора

Еще один метод, который вы можете использовать для открытия DLL-файла, — использование декомпилятора. Декомпилятор — это программа, предназначенная для того, чтобы брать функциональный код и создавать пригодный для использования файл, в котором вы можете настроить код и преобразовать его в функциональный код. Использование декомпилятора может быть безопасным вариантом, поскольку вы можете просматривать код, не изменяя его и не затрагивая ваш компьютер. Ниже приведены шаги, которые могут помочь вам использовать декомпилятор для открытия файлов DLL:

Найдите программу-декомпилятор и установите ее. Есть несколько вариантов программ-декомпиляторов. Выберите тот, который вам наиболее удобен.

Откройте файлы DLL в декомпиляторе. Этот процесс может варьироваться от программы к программе, но вы можете найти кнопку с надписью «Файл», которую можно нажать, чтобы открыть список, в котором вы можете найти нужный файл DLL.

Используйте «Проводник сборок» для просмотра файла DLL. Файлы DLL хранят информацию в виде «узлов» и «подузлов», которые вы можете исследовать в декомпиляторе. Нажав на один узел, вы увидите все содержащиеся в нем подузлы.

Дважды щелкните узел, чтобы увидеть содержащийся в нем код. Просмотрев код, вы можете просмотреть его и убедиться, что различные аспекты выполняют нужные вам функции.

Обратите внимание, что ни одна из компаний или продуктов, упомянутых в этой статье, не связана с компанией Indeed.

Значок

+1

В этом сообщении на форуме представлен пример кода C++ для чтения значения из текстового файла в DLL.

В основном это дополнение к следующей статье базы знаний. Единственная разница в том, что мы будем делать с кодом C++ то же самое, что и в стиле C++.

Во вложениях приложен пример кода. Этот код делает то же самое, что показано в следующем сообщении на форуме. Разница в том, что данные об эффективности дифракции считываются из текстового файла.

Мы объясним это построчно ниже.

Первое, что нужно сделать, это определить глобальную переменную, которая объявляется вне всех функций. Как обсуждалось здесь, во время трассировки лучей в OpticStudio DLL будет вызываться несколько раз. Для глобальной переменной внутреннее значение не изменяется, и DLL всегда может видеть одни и те же данные в другом потоке. Наш план состоит в том, чтобы прочитать данные из текстового файла и сохранить их в этой глобальной переменной, когда OpticStudio вызовет DLL в первый раз. Затем позже нам не нужно снова читать текстовый файл, а нужно просто прочитать сохраненные данные в глобальной переменной.

Не рекомендуется использовать указатели в C++, за исключением тех случаев, когда вы считаете, что вектор<> не может обрабатывать нужные вам данные. Здесь мы определили два вектора для double: Rdata и Tdata, а также два целых числа для сохранения порядка дифракции чисел в направлениях x и y.

200611-144616-2020-06-11_14-45-12.jpg

Обратите внимание, что нам нужно включить, чтобы использовать вектор-контейнер STL.

200611- 145512-image.jpg

Внутри функции DllMain() мы сначала определяем некоторую переменную для чтения и анализа данных из текстового файла.

200611- 145620-image.jpg

Сначала мы проверяем значение ul_reason_for_all. Есть 4 значения, но мы будем использовать только случай DLL_PROCESS_ATTACH. Это будет верно только тогда, когда OpticStudio впервые вызовет эту DLL. Обратите внимание, что DLL_PROCESS_DETACH будет вызываться, когда мы удаляем DLL в OpticStudio или просто закрываем OpticStudio.

200611- 145729-image.jpg

Теперь проверим, что делается для чтения текстового файла в случае DLL_PROCESS_ATTACH. Строка 39-48, как показано ниже, предназначена для «открытия» текстового файла. Здесь мы предполагаем, что имя текстового файла — 2D_grating_efficiency_data.txt, но при необходимости его можно изменить.

200611- 150014-image.jpg

Обратите внимание, что если открыть текстовый файл не удалось, выдается сообщение об ошибке, и DLL возвращает FALSE в OpticStudio. Ниже показано, как выглядит ошибка. Левое сообщение, возвращаемое библиотекой DLL. Правая сторона — это сообщение, возвращаемое OpticStudio, когда DLL возвращает FALSE.

200611- 150401-изображение.jpg
200611-150409-image.jpg

Существует множество способов анализа данных. Здесь мы знакомим вас со строковым потоком. Просто рассмотрите строки 51-53 ниже как триплет для чтения новой строки в текстовом файле. Убедитесь, что значение в этой строке разделено пробелами в текстовом файле. Затем данные можно просто проанализировать, как показано в строке 55. В строках 57-62 выполняется некоторая проверка достоверности данных. Строка 63-64 гарантирует, что значение является нечетным целым числом. Это всего лишь пример, и пользователи должны решить, каким должен быть формат DLL.

200611- 150606-image.jpg

Важно определить размер вектора перед сохранением в него данных, иначе произойдет ошибка.

200611- 151001-image.jpg

Затем в строках 72–96 у нас есть цикл for для чтения всех данных. Предполагается, что это num_nx*num_ny строк из строки 2, и мы будем читать их одну за другой.

Строки 75 и 77 изменяют индекс цикла на соответствующий индекс порядка для x и y. Эта DLL предполагает, что данные также определены в тексте таким же образом.

Строки с 82 по 84 представляют собой "тройку", как обсуждалось выше.

Строки 86–95 анализируют данные эффективности для отражения и передачи, проверяют успешность анализа и сохраняют значение в векторе.

Строка 97 закрывает открытый текстовый файл.

200611- 151125-image.jpg

Затем в основном коде мы можем просто использовать данные из глобальных переменных Rdata и Tdata, как показано ниже.

200611- 151727-image.jpg

Обратите внимание, что мы не слишком много говорили о том, как использовать «вектор», но вы сможете найти множество ресурсов в поисковой системе. Например, следующий вариант является хорошим введением для тех, кто впервые использует этот шрифт.

Также прилагается образец системы и образец текстового файла. Образец текстового файла должен быть помещен в папку \Zemax\DLL\Diffractive\, как мы определили в коде.

Читайте также: