<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=2554707</guid>
        <pubDate>Thu, 01 Apr 2010 12:06:36 +0000</pubDate>
        <title>Dll FAQ</title>
        <link>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=2554707</link>
        <description><![CDATA[Mr.Delphist: <strong class='tag-b'>Ninetta</strong><br>
Честно говоря, тоже один раз пробовал Dll2Lib - ничего не вышло. Может, готовить его не умею.<br>
Если есть DLL - грузи её при старте приложения через LoadLibrary, и всё.]]></description>
        <author>Mr.Delphist</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=2552423</guid>
        <pubDate>Tue, 30 Mar 2010 15:55:06 +0000</pubDate>
        <title>Dll FAQ</title>
        <link>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=2552423</link>
        <description><![CDATA[Ninetta: А расскажите пожалуйста про неявное подключение? <br><br>У меня есть только файлы dll и lib, и то lib сгенерирован из dll с помощью программы Dll2Lib, h-файла нету. Хочу подключить библиотеку неявно, скажите, такое подключение может работать? <br>#pragma comment(lib, &quot;NeuroNet.lib&quot;)<br><br>У меня почему-то не работает, походу не видит библиотеку, не отображает её в ClassView. А может просто функции не так вызываю...<br><br>Пробовала подключить через Project -&gt; Linker -&gt; Input -&gt; Additional Dependencies, всё равно библиотеку не видит.<br>Может дело в том, что нету h-файла? Тогда вопрос - как его получить??<br><br>Или я просто что-то не правильно делаю?]]></description>
        <author>Ninetta</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=325412</guid>
        <pubDate>Fri, 26 Mar 2004 20:52:51 +0000</pubDate>
        <title>Dll FAQ</title>
        <link>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=325412</link>
        <description><![CDATA[~Archer~: Опробовал. Огромное спасибо автору&#33;&#33;&#33; Этой вещицы как раз нехватало.<br>Но есть один вопрос: длина строки указываемая в GetInputString есть максимальная длина вводимого текста, но в качестве релультата всегда возвращается на один символ меньше. Т.е. если ввести для инициализации Hello World и просто высести ту же строку то по любому получается Hello Worl. Если на 1 увеличить длину, то можно будет ввести еще один символ после Hello World но он будет обрезан после преобразования... Это баг или я что-то не так делаю?]]></description>
        <author>~Archer~</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=308345</guid>
        <pubDate>Mon, 01 Mar 2004 14:49:53 +0000</pubDate>
        <title>Dll FAQ</title>
        <link>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=308345</link>
        <description><![CDATA[UncleBob: Здесь просто Release версия, готовая для использования + хедер + lib (для Visual Studio)]]></description>
        <author>UncleBob</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=308343</guid>
        <pubDate>Mon, 01 Mar 2004 14:47:38 +0000</pubDate>
        <title>Dll FAQ</title>
        <link>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=308343</link>
        <description><![CDATA[UncleBob: Как иллюстрация к теме, и как продолжение тем <a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=46549' target='_blank'>&quot;Диалоговое окно ввода строки&quot;</a> и <a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=43025' target='_blank'>&quot;Как можно вызвать диал для ввода строки?&quot;</a>, я написал DLL, реализующую диалог ввода строки.<br>
<br>
Что умеет данная DLL:<br>
- Создавать и вызывать имеющийся у нее в ресурсах диалог.<br>
- Возвращать введенную пользователем строку.<br>
- Может быть безболезненно использована несколькими потоками одного процесса.<br>
- Поддерживать ANSI и Unicode вызовы.<br>
<br>
DLL экспортирует 2 функции:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">GetInputStringA(HWND hWnd, LPSTR lpText, UINT uSize, LPCSTR lpCaption);</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">GetInputStringW(HWND hWnd, LPWSTR lpText, UINT uSize, LPCWSTR lpCaption);</div></ol></div></div></div></div>Объединенные в хедере под один define<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#ifdef UNICODE</div><div class="code_line">&nbsp;&nbsp;#define GetInputString GetInputStringW</div><div class="code_line">#else</div><div class="code_line">&nbsp;&nbsp;#define GetInputString GetInputStringA</div><div class="code_line">#endif // UNICODE</div></ol></div></div></div></div><br>
Параметры:<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><strong class='tag-b'>hWnd</strong> [входной] - хэндл родительского окна (или NULL)<br>
<strong class='tag-b'>lpText</strong> [входной/выходной] - указатель на буфер, где хранится исходная строка (на входе) и куда помещается введенная пользователем строка (на выходе)<br>
<strong class='tag-b'>uSize</strong> [входной] - размер буфера lpText (в TCHARах)<br>
<strong class='tag-b'>lpCaption</strong> [входной] - заголовок диалога</div></div><br>
DLL написана на чистом WinAPI C, не использует библиотек MFC и VC runtime.<br>
<br>
Использованные функции WinAPI:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">KERNEL32</div><div class="code_line">&nbsp;&nbsp;Thread Local Storage (TLS) functions</div><div class="code_line">&nbsp;&nbsp; &nbsp;TlsAlloc</div><div class="code_line">&nbsp;&nbsp; &nbsp;TlsFree</div><div class="code_line">&nbsp;&nbsp; &nbsp;TlsGetValue</div><div class="code_line">&nbsp;&nbsp; &nbsp;TlsSetValue</div><div class="code_line">&nbsp;&nbsp;Memory Management</div><div class="code_line">&nbsp;&nbsp; &nbsp;LocalAlloc</div><div class="code_line">&nbsp;&nbsp; &nbsp;LocalFree</div><div class="code_line">&nbsp;&nbsp;Debugging/Error handling</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetLastError</div><div class="code_line">USER32</div><div class="code_line">&nbsp;&nbsp;Dialog Boxes</div><div class="code_line">&nbsp;&nbsp; &nbsp;DialogBox</div><div class="code_line">&nbsp;&nbsp; &nbsp;EndDialog</div><div class="code_line">&nbsp;&nbsp; &nbsp;GetDlgItem</div><div class="code_line">&nbsp;&nbsp; &nbsp;GetDlgItemText</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetDlgItemText</div><div class="code_line">&nbsp;&nbsp;Windows</div><div class="code_line">&nbsp;&nbsp; &nbsp;PostMessage</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;WM_COMMAND</div><div class="code_line">&nbsp;&nbsp; &nbsp;SendMessage</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;EM_LIMITTEXT</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;EM_SETSEL</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetFocus</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetWindowPos</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetWindowText</div></ol></div></div></div></div><br>
Файл проекта представлен в 2-х версиях - для Visual Studio 6 и Visual Studio 2003. Оптимальный размер выходного файла (5120 байт) - под VS 2003. Код содержит массу комментариев, так что разобраться в нем, IMHO, не представляет проблем. <br>
<br>
Пользуйтесь, на здоровье. Комментарии welcome, на вопросы отвечу. О багах сообщайте :) Тестировалось все под Win XP Pro.<br>
<br>
<span class="tag-color tag-color-named" data-value="blue" style="color: blue">28.03.04</span> <span class="tag-color tag-color-named" data-value="red" style="color: red">BUGFIX</span>: <span class="tag-color tag-color-named" data-value="gray" style="color: gray">Исправлена ошибка с EM_LIMITTEXT. Тескт должен быть ограничен по длине буфера -1 TCHAR. Спасибо <a class='tag-url' href='http://forum.sources.ru/index.php?showuser=9806' target='_blank'>~Archer~</a>у.</span>]]></description>
        <author>UncleBob</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=289395</guid>
        <pubDate>Thu, 29 Jan 2004 05:17:18 +0000</pubDate>
        <title>Dll FAQ</title>
        <link>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=289395</link>
        <description><![CDATA[Visitor: Ну ето у же за рамками топика.<br><br>Здесь надо копаться в<br>1. Windows kernel internals<br>2. Portable executable structure]]></description>
        <author>Visitor</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=289124</guid>
        <pubDate>Wed, 28 Jan 2004 13:31:19 +0000</pubDate>
        <title>Dll FAQ</title>
        <link>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=289124</link>
        <description><![CDATA[Astral: А как насчет такого вопроса... Как можно воспользоваться Dll-кой, если она находиться в памяти в буфере. Т.е. есть указатель на область памяти, куда загрузили (считали) библиотечку (типа char* Dll)<br><br>Пример использования... файл библиотеки передается по сети, но на диск, для того, чтобы ее динамически подключить писать нельзя... А считана она в память...<br><br>Как из char* Dll сделать HINSTANCE Dll??? Или выполнить что то вроде GetProcAddress(..., &quot;Func&quot;), не через HINSTANCE а через char*<br><br>Кстати. Насущный вопрос. Сам уже не раз с таким сталкивался...  :angry: когда писать на диск нельзя, а взять нужную библиотечку для работы программы можно из интернета...  :huh:]]></description>
        <author>Astral</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=257702</guid>
        <pubDate>Thu, 04 Dec 2003 17:22:37 +0000</pubDate>
        <title>Dll FAQ</title>
        <link>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=257702</link>
        <description><![CDATA[Lavrik: можно вставить вопрос про общие глобальные переменные (сам недавно столкнулся с такой проблемой), т.е. как сделать одну и ту же переменную доступную для разных процессов, подгрузивших нашу ДЛЛ) - если надо канешна  :)<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;</div><div class="code_line">#pragma data_seg(&quot;mydata&quot;)  //определяем секцию для наших данных</div><div class="code_line">&nbsp; int i=0;</div><div class="code_line">&nbsp; // другие переменные общего пользования</div><div class="code_line">#pragma data_seg()</div><div class="code_line">#pragma comment(linker,&quot;-SECTION:mydata,rws&quot;);//указываем линковщику что наша секция доступна для чтения/записи и расшаренная</div></ol></div></div></div></div>]]></description>
        <author>Lavrik</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=251704</guid>
        <pubDate>Tue, 25 Nov 2003 07:36:22 +0000</pubDate>
        <title>Dll FAQ</title>
        <link>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=251704</link>
        <description><![CDATA[Visitor:  Щас внесу <!--emo&:)--><img src='http://forum.sources.ru/html/emoticons/smile.gif' border='0' style='vertical-align:middle' alt='smile.gif' /><!--endemo--><br>---<br>Добавляю... ]]></description>
        <author>Visitor</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=251586</guid>
        <pubDate>Mon, 24 Nov 2003 21:20:54 +0000</pubDate>
        <title>Dll FAQ</title>
        <link>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=251586</link>
        <description><![CDATA[rcz:  Не знаю, уместно ли, но дополнения:<br><br><!--QuoteBegin--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td><b>Цитата</b> </td></tr><tr><td id='QUOTE'><!--QuoteEBegin-->Q: Как мне узнать, какие функции есть в Dll (експортируются из нее)?<br>A: Вместе с большинством сред разработки поставляются утилиты для получения списка експортируемых из Dll объектов. ..<!--QuoteEnd--></td></tr></table><div class='postcolor'><!--QuoteEEnd--><br>Для VC еще есть Dependency Walker (depends.exe) - полезная утилита<br><br><br><!--QuoteBegin--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td><b>Цитата</b> </td></tr><tr><td id='QUOTE'><!--QuoteEBegin--><br>Q: Как мне узнать, какие параметры принимает функция, експортируемая из Dll, и как ей следует пользоваться?<br>A: В общем случае -- никак. Dll не содержит подобной информации.<br><br>Если Dll была написана на C++, и использовались, т.н., декорированные имена, то типы аргументов функции можно получить, анализируя имена функций.<br><!--QuoteEnd--></td></tr></table><div class='postcolor'><!--QuoteEEnd--><br>Использовать IDA disassembler. Можно узнать сколько аргументов и (при дальнейшем анализе) их назначение.<br><br> ]]></description>
        <author>rcz</author>
        <category>C/C++ FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=247753</guid>
        <pubDate>Tue, 18 Nov 2003 14:21:39 +0000</pubDate>
        <title>Dll FAQ</title>
        <link>https://forum.sources.ru/index.php?showtopic=38244&amp;view=findpost&amp;p=247753</link>
        <description><![CDATA[Visitor: Доняли, выкладываю пилотную версию. :)<br>
<br>
<strong class='tag-b'>Q:</strong> <span class="tag-color tag-color-named" data-value="blue" style="color: blue">Как мне узнать, какие функции есть в Dll (експортируются из нее)?</span><br>
<strong class='tag-b'>A:</strong> Вместе с большинством сред разработки поставляются утилиты для получения списка експортируемых из Dll объектов.<br>
<br>
Для MSVC ето dumpbin.exe, которая просто выдает список експортируемых объектов, если ее запустить с ключом /EXPORTS:<br>
<em class='tag-i'>dumpbin.exe /EXPORTS mydll.dll</em><br>
<br>
Для продуктов Borland ето impdef.exe, которая делает .DEF-файл (см. ниже), содержащий названия експортируемых из Dll объектов:<br>
<em class='tag-i'>impdef.exe mydll.DEF mydll.DLL</em><br>
<br>
Кроме того, можно воспользоваться утилитой <a class='tag-url' href='http://www.filesearch.ru/cgi-bin/s?q=dllview&t=f&w=a' target='_blank'>DllView</a>, или утилитой Dependency Walker, входящей в состав MS Visual Studio.<br>
<br>
<strong class='tag-b'>Q:</strong> <span class="tag-color tag-color-named" data-value="blue" style="color: blue">Как мне узнать, какие параметры принимает функция, експортируемая из Dll, и как ей следует пользоваться?</span><br>
<strong class='tag-b'>A:</strong> В общем случае -- никак. Dll не содержит подобной информации.<br>
<br>
Если Dll была написана на C++, и использовались, т.н., <em class='tag-i'>декорированные</em> имена, то типы аргументов функции можно получить, <a class='tag-url' href='http://msdn.microsoft.com/library/en-us/vccore/html/_core_Decorated_Names.asp' target='_blank'>анализируя имена функций</a>.<br>
<br>
Если библиотека была написана на одном из распространенных языков высокого уровня, можно воспользоваться дизассемблерами, вроде IDA, чтобы проанализировать сруктуру параметров функции.<br>
<br>
<strong class='tag-b'>Q:</strong> <span class="tag-color tag-color-named" data-value="blue" style="color: blue">Мне нужно сделать Dll, из которой експортируется одна функция. С чего вообще начинать?</span><br>
<strong class='tag-b'>A:</strong> Необходимо, как и для обычной библиотеки, создать файл интерфейса и  файл реализации:<br>
<strong class='tag-b'>mydll.h</strong><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#ifndef __MYDLL_H</div><div class="code_line">#define __MYDLL_H</div><div class="code_line">&nbsp;</div><div class="code_line">#ifdef __cplusplus</div><div class="code_line">extern &quot;C&quot;{</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">__declspec( dllexport ) int Sum(int, int);</div><div class="code_line">&nbsp;</div><div class="code_line">#ifdef __cplusplus</div><div class="code_line">}</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">#endif /* __MYDLL_H */</div></ol></div></div></div></div><br>
<br>
<strong class='tag-b'>mydll.cpp</strong><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;windows.h&#62;</div><div class="code_line">#include &quot;mydll.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">BOOL APIENTRY DllMain( HANDLE hModule, </div><div class="code_line">&nbsp;                      DWORD  ul_reason_for_call, </div><div class="code_line">&nbsp;                      LPVOID lpReserved</div><div class="code_line">&nbsp;     )</div><div class="code_line">{</div><div class="code_line">&nbsp;   return TRUE;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int Sum(int a, int b)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;return a+b;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
блок extern &quot;C&quot; можно убрать, если требуется, чтобы експортируемые имена соответствовали <a class='tag-url' href='http://msdn.microsoft.com/library/en-us/vccore/html/_core_Decorated_Names.asp' target='_blank'>соглашениям C++</a> о декорации имен, и Dll будет использоваться только в проектах на C++.<br>
<br>
<strong class='tag-b'>Q:</strong> <span class="tag-color tag-color-named" data-value="blue" style="color: blue">Как мне теперь воспользоваться только что созданной Dll mydll?</span><br>
<strong class='tag-b'>A:</strong> Существует два способа подключить Dll к своему проекту:<br>
1. Использовать раннее динамическое связывание, то есть подключить к своему проекту библиотеку импортированных функций.<br>
Если мы сами откомпилировали dll, или нам вместе с dll дали ету библиотеку, то ее нужно просто подключить к своему проекту.<br>
<br>
Если нет, нужно библиотеку импортированных функций создать.<br>
<br>
В MSVC ето делается, например, так:<br>
link /DLL /DEF:mydll.def /IMPLIB:mydll.lib /OUT:dummy<br>
Линкер ругается, но создает библиотеку mydll.lib, которую можно подключать к своему проекту.<br>
В продуктах Borland для етого существует специальная утилита implib.exe<br>
<br>
mydll.def -- .DEF-файл, который содержит список експортируемых из Dll функций (см. ниже).<br>
<br>
2. Использовать позднее динамическое связывание, т.е, загружать Dll и получать адреса експортируемых из нее функций не автоматически в момент запуска программы, а вручную и в произвольный момент времени.<br>
Для етого нужно знать только имя файла библиотеки и название функции.<br>
<br>
Чтобы воспользоваться функцией Sum, содержащейся в библиотеке mydll.dll, в своем проекте нужно написать примерно так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &quot;mydll.h&quot;</div><div class="code_line">#define SUM_FUNC_NAME &quot;Sum&quot;</div><div class="code_line">...</div><div class="code_line">typedef int (* SumFunctionType)(int, int);</div><div class="code_line">...</div><div class="code_line">SumFunctionType SumFunctionAddress;</div><div class="code_line">...</div><div class="code_line">HMODULE hLib = LoadLibrary(&quot;mydll.dll&quot;);</div><div class="code_line">if(hLib)</div><div class="code_line">{</div><div class="code_line">&nbsp;   SumFunctionAddress = (SumFunctionType)GetProcAddress(hLib, SUM_FUNC_NAME);</div><div class="code_line">&nbsp;   if(SumFuncAddress)</div><div class="code_line">&nbsp;       x = SumFuncAddress(y, z);</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Более подробно, см. справку по функциям LoadLibrary и GetProcAddress<br>
<br>
<strong class='tag-b'>Q:</strong> <span class="tag-color tag-color-named" data-value="blue" style="color: blue">Почему у меня не работает пример из предыдущего вопроса? Я разбирался, и выяснил, что GetProcAddress возвращает NULL?</span><br>
<strong class='tag-b'>A:</strong> Видимо, функция Sum <em class='tag-i'>в Dll</em> называется не &quot;Sum&quot;, а так, как ее обозвал компилятор. Чтобы он ее обзывал так, как захотите вы, используйте .DEF файл (см. ниже).<br>
<br>
<strong class='tag-b'>Q:</strong> <span class="tag-color tag-color-named" data-value="blue" style="color: blue">Что ето за такой .DEF файл, и для чего он нужен.</span><br>
<strong class='tag-b'>A:</strong> .DEF-файл содержит т.н., определения модуля, и используется сборщиком при компоновке Dll и Exe.<br>
.DEF-файл содержит много разных секций, в отношении работы с Dll нас будут интересовать две:<br>
<br>
Секция LIBRARY задает имя библиотеки<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">LIBRARY MYDLL</div></ol></div></div></div></div><br>
<br>
Секция EXPORTS задает список експортируемых объектов<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">EXPORTS</div><div class="code_line">&nbsp;       Sum         @1</div></ol></div></div></div></div><br>
В етой же секции можно указывать псевдонимы для функций, т.е., експортировать одну и ту же функцию из Dll под разными именами.<br>
<br>
Более подробно см. описание <a class='tag-url' href='http://msdn.microsoft.com/library/en-us/vccore98/html/_core_module.2d.definition_files.asp' target='_blank'>Module Definition File</a><br>
<br>
<strong class='tag-b'>Q:</strong> <span class="tag-color tag-color-named" data-value="blue" style="color: blue">Я создал и отладил Dll, которую хочу использовать (через библиотеку импортированных функций) в своих проектах. Куда мне ее следует поместить, чтобы все мои проекты могли получить к ней доступ?</span><br>
<strong class='tag-b'>A:</strong> Windows ищет Dll следующим образом:<br>
1. Значала проверяются все <em class='tag-i'>уже загруженные</em> библиотеки, если среди них находится Dll с тем же именем, программа связывается с ней.<br>
2. Затем Windows пытется найти Dll в папке, где расположен исполняемый файл программы, использующей Dll.<br>
3. Затем, Windows пытается найти Dll в текущем каталоге.<br>
4. Затем, Windows пытается найти Dll в системном каталоге Windows (что-то вроде C:&#092;Windows&#092;System32 для NT-систем)<br>
5. Затем, Windows пытается найти Dll в каталоге Windows (что-то вроде C:&#092;Windows)<br>
6. Наконец, Windows пытается найти Dll в одной из папок, перечисленных в переменной окружения PATH<br>
<br>
<strong class='tag-b'>Q:</strong> <span class="tag-color tag-color-named" data-value="blue" style="color: blue">Как мне воспользоваться ресурсами, хранящимися в Dll?</span><br>
<strong class='tag-b'>A:</strong> Точно так же, как и ресурсами, хранящимися в собственной программе -- загрузить и использовать. Единственное отличие -- необходимо загрузить Dll, и в функцию LoadResource передать ее хендл, вместо HINSTANCE собственной программы:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">HMODULE hLib = LoadLibrary(&quot;rsrclib.dll&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">if(hLib)</div><div class="code_line">{</div><div class="code_line">&nbsp;   HRSRC hRes = FindResource(hLib, &quot;MYDATA&quot;, &quot;MYRESTYPE&quot;);</div><div class="code_line">&nbsp;   if(hRes)</div><div class="code_line">&nbsp;   {</div><div class="code_line">&nbsp;       HGLOBAL hMem = LoadResource(hLib, hRes);</div><div class="code_line">&nbsp;       if(hRes)</div><div class="code_line">&nbsp;       {</div><div class="code_line">&nbsp;           char * pMyData = (char *)LockResource(hMem);</div><div class="code_line">&nbsp;           // pMyData указывает на загруженные из ресурса данные</div><div class="code_line">&nbsp;           ...</div><div class="code_line">&nbsp;       }</div><div class="code_line">&nbsp;   }</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
<strong class='tag-b'>Q:</strong> <span class="tag-color tag-color-named" data-value="blue" style="color: blue">Почему при вызове функции из Dll я получаю сообщение типа &quot;ESP is not correctly saved across function call&quot; или &quot;Bad calling convention&quot;, или моя программа вылетает, хотя функция, по всем признакам, сработала как надо?</span><br>
<strong class='tag-b'>A:</strong> Чтобы ето понять, надо разобраться с тем, как осуществляется вызов подпрограмм, <em class='tag-i'>передача им параметров</em> и <em class='tag-i'>возврат из подпрограмм</em> в языках высокого уровня.<br>
<br>
В паскале, перед вызовом подпрограммы, все параметры подпрограммы помещаются в стек, в тот же, в котором хранятся адреса возврата. Подпрограмма, завершая свою работу, извлекает из стека адрес возврата и <em class='tag-i'> все переданные ей параметры</em> (т.е., паскалевская подпрограмма всегда знает сколько и каких параметров ей передают).<br>
<br>
В Си перед вызовом подпрограммы все ее параметры также помещаются в стек, а подпрограмма завершая свою работу НЕ извлекает ети параметры. Етим должна заниматься вызвавшая программа.<br>
<br>
Существуют и другие варианты вызова функций. <br>
<br>
Соответственно, чтобы корректно вызвать функцию Dll, необходимо знать какой формат вызова (<a class='tag-url' href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_core_Calling_Conventions_Topics.asp' target='_blank'>Calling convention</a>) поддерживает ета функция. <br>
<br>
Опять же, в общем случае ету информацию из Dll получить невозможно, но чаще всего используется формат вызова __stdcall и __cdecl.<br>
<br>
<strong class='tag-b'>Q:</strong> <span class="tag-color tag-color-named" data-value="blue" style="color: blue">А как сделать в Dll переменную, общую для всех использующих ету Dll процессов? Например, глобальный счетчик? Я объявляю в Dll глобальную переменную-счетчик, но она считает только внутри одного процесса :(</span><br>
<strong class='tag-b'>A:</strong> Для етого необходимо поместить переменную в <em class='tag-i'>общую</em> для всех процессов секцию данных. По умолчанию, для каждого процесса подключающего Dll, создается новая отдельная секция данных Dll.<br>
<br>
Чтобы переменные помещались в общую секцию данных, используйте директивы pragma:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#pragma data_seg(&quot;mydata&quot;)  //определяем секцию для наших данных</div><div class="code_line">&nbsp;int i=0;</div><div class="code_line">&nbsp;// другие переменные общего пользования</div><div class="code_line">#pragma data_seg()</div><div class="code_line">#pragma comment(linker,&quot;-SECTION:mydata,rws&quot;);//указываем линковщику что наша секция доступна для чтения/записи и общая</div></ol></div></div></div></div>]]></description>
        <author>Visitor</author>
        <category>C/C++ FAQ</category>
      </item>
	
      </channel>
      </rss>
	