Экспорт функций от DLL с dllexport

Вы можете сохранить интервал в уведомлении через .data().

notification.data('int', setInterval(...

Затем, в обратных вызовах событий вы можете ссылаться на интервал через

$(this).data('int')

Также, примечание + 1 - 1 не делает ничего значимого.

94
задан Aardvark 16 December 2013 в 14:57
поделиться

2 ответа

Если Вы хотите простой экспорт C, используйте проект C не C++. C++ DLLs полагается на искажение имени для всех измов C++ (пространства имен и т.д....). Можно скомпилировать код как C путем входа в настройки проекта под C/C++> Усовершенствованный, существует опция "Compile As", какой cooresponds к компилятору переключает / TP и / TC.

Экспорт/Импорт DLL Освобождает в VC ++

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

#ifdef LIBRARY_EXPORTS
#    define LIBRARY_API __declspec(dllexport)
#else
#    define LIBRARY_API __declspec(dllimport)
#endif

Затем на функции, что Вы хотите быть экспортированными, Вы используете LIBRARY_API:

LIBRARY_API int GetCoolInteger();

В Вашей библиотеке разрабатывают проект, создают определение LIBRARY_EXPORTS, это заставит Ваши функции экспортироваться для Вашей сборки DLL.

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

, Если Ваша библиотека должна быть межплатформенной, как ничто можно определить LIBRARY_API если не в Windows:

#ifdef _WIN32
#    ifdef LIBRARY_EXPORTS
#        define LIBRARY_API __declspec(dllexport)
#    else
#        define LIBRARY_API __declspec(dllimport)
#    endif
#elif
#    define LIBRARY_API
#endif

При использовании dllexport/dllimport Вы не должны использовать файлы DEF при использовании файлов DEF, Вы не должны использовать dllexport/dllimport. Эти два метода выполняют ту же задачу различные пути, я полагаю, что dllexport/dllimport является рекомендуемым методом из двух.

Экспортирующие неискаженные функции от DLL C++ для LoadLibrary/PInvoke

при необходимости в этом для использования LoadLibrary и GetProcAddress или возможно выполнения PInvoke от.NET, можно использовать extern "C" встроенный с dllexport. И так как мы используем GetProcAddress вместо dllimport, мы не должны делать танца ifdef сверху, просто простой dllexport:

Код:

#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport)

EXTERN_DLL_EXPORT int getEngineVersion() {
  return 1;
}

EXTERN_DLL_EXPORT void registerPlugin(Kernel &K) {
  K.getGraphicsServer().addGraphicsDriver(
    auto_ptr<GraphicsServer::GraphicsDriver>(new OpenGLGraphicsDriver())
  );
}

И вот то, что экспорт похож с Dumpbin / на экспорт:

  Dump of file opengl_plugin.dll

  File Type: DLL

  Section contains the following exports for opengl_plugin.dll

    00000000 characteristics
    49866068 time date stamp Sun Feb 01 19:54:32 2009
        0.00 version
           1 ordinal base
           2 number of functions
           2 number of names

    ordinal hint RVA      name

          1    0 0001110E getEngineVersion = @ILT+265(_getEngineVersion)
          2    1 00011028 registerPlugin = @ILT+35(_registerPlugin)

, Таким образом, этот код хорошо работает:

m_hDLL = ::LoadLibrary(T"opengl_plugin.dll");

m_pfnGetEngineVersion = reinterpret_cast<fnGetEngineVersion *>(
  ::GetProcAddress(m_hDLL, "getEngineVersion")
);
m_pfnRegisterPlugin = reinterpret_cast<fnRegisterPlugin *>(
  ::GetProcAddress(m_hDLL, "registerPlugin")
);
122
ответ дан Community 24 November 2019 в 06:07
поделиться

Я думаю, что _naked мог бы получить то, что Вы хотите, но он также препятствует тому, чтобы компилятор генерировал код управления стеком для функции. экстерн "C" вызывает художественное оформление имени стиля C. Удалите это, и это должно избавиться от Вашего _. Компоновщик не добавляет символы нижнего подчеркивания, компилятор делает. stdcall заставляет размер стопки аргумента быть добавленным.

Для больше, см.: http://en.wikipedia.org/wiki/X86_calling_conventions http://www.codeproject.com/KB/cpp/calling_conventions_demystified.aspx

больший вопрос состоит в том, почему Вы хотите сделать это? Что случилось со скорректированными именами?

-1
ответ дан Rob K 24 November 2019 в 06:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: