Как я могу получить четкие имена -экспорт функции из встроенной DLL?Я всегда получаю оригинальное имя + бред - PullRequest
0 голосов
/ 18 июня 2011

примечание: в первую очередь я использую Visual Studio 2010.

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

Обычно это мой способ.Заголовок DLL выглядит ...

#define DLLAPI extern "C" __declspec(dllexport)

DLLAPI BOOL WINAPI FUNCTION1(...);
DLLAPI BOOL WINAPI FUNCTION2(...);

Я не добавляю никаких команд в проект или что-либо еще, все, что я делаю, чтобы экспортировать их - это в заголовках + добавление DLLAPI к функциям в исходном файле ofc.

Теперь, когда мне нужно получить имя функции из моего внешнего приложения, это вызывает у меня проблемы, потому что это всегда что-то вроде FUNCTION1xa1 @ accept79sax_ или что-то в этом роде ...

Я видел проект, который используетФайл .DEF и делает его заголовки похожими на ...

// INCLUDE FILE generated by "Pelles C for Windows, version 3.00".

#ifndef _HOOK_H
#define _HOOK_H

#ifdef _HOOK_
#define HOOKAPI  __declspec(dllexport)
#else
#define HOOKAPI  __declspec(dllimport)
#endif /* _HOOK_ */

#ifndef WINAPI
#define WINAPI  __stdcall
#endif

HOOKAPI int WINAPI SampleFunction(int, int);

#endif /* _HOOK_H */

, а его файл .def выглядит так ...

EXPORTS
    SetValuesCBT
    SetValuesKey
    SetValuesMouse
    MouseProc
    KeyProc
    CBTProc

SECTIONS
    .shared READ WRITE SHARED

Это приводит к очень четким именам экспортируемых функций, так же какони называются (как доказано dumpbin.exe), между прочим, если это имеет значение, он также имеет файл .pjj со следующим содержимым ...

# 
# PROJECT FILE generated by "Pelles C for Windows, version 5.00".
# WARNING! DO NOT EDIT THIS FILE.
# 

POC_PROJECT_VERSION = 5.00.1#
POC_PROJECT_TYPE = 1#
POC_PROJECT_ARGUMENTS = #
CC = pocc.exe#
AS = #
RC = porc.exe#
LINK = polink.exe#
SIGN = posign.exe#
CCFLAGS = -Tx86-coff -Ot -W1 -Ze -Gz#
ASFLAGS = -c -nologo -coff -W1 -Cu#
RCFLAGS = -r#
LINKFLAGS = -machine:ix86 -subsystem:windows kernel32.lib user32.lib gdi32.lib comctl32.lib comdlg32.lib advapi32.lib delayimp.lib -dll#
WizCreator = Pelle Orinius#
SIGNFLAGS = -location:CU -store:MY -timeurl:http://timestamp.verisign.com/scripts/timstamp.dll -errkill#
INCLUDE = $(PellesCDir)\Include\Win;$(PellesCDir)\Include#
LIB = $(PellesCDir)\Lib\Win;$(PellesCDir)\Lib#

.SILENT:

# 
# Build hook.dll.
# 
hook.dll: \
    output\DLL.obj \
    EXPORTS.DEF
    $(LINK) $(LINKFLAGS) -out:"$@" $**

# 
# Build DLL.obj.
# 
output\DLL.obj: \
    DLL.C
    $(CC) $(CCFLAGS) "$!" -Fo"$@"

.EXCLUDEDFILES:

Я не знаю, как мне эмулировать это в моем VS 2010проект, поэтому, когда я строю свои имена функций DLL арпросто и точно?

1 Ответ

1 голос
/ 18 июня 2011

Просто создайте файл DEF, как вы показали выше, только с двумя вашими функциями и перейдите в параметры ссылки и укажите, чтобы использовать этот файл def.

С http://msdn.microsoft.com/en-us/library/34c30xs1%28v=vs.80%29.aspx

Параметр / DEF передает файл определения модуля (.def) в линкер. Может быть только один файл .def указано для ССЫЛКИ. Подробнее о файлы .def, см. Определение модуля Файлы. Чтобы установить этот параметр компоновщика в разработка Visual Studio окружающая среда

  1. Открыть диалоговое окно страниц свойств проекта. Подробнее см. Настройка свойств проекта Visual C ++.
  2. Щелкните папку Linker.
  3. Щелкните на странице свойств ввода.
  4. Изменить свойство файла определения модуля.

Чтобы указать файл .def из среда разработки, вы должны добавить его в проект вместе с другими файлы, а затем укажите файл Параметр / DEF.

...