У меня есть dll, которая содержит более 400 функций, и мой exe-файл использует только 15 функций из dll, поэтому мне нужно создать новую dll и экспортировать функции и подделать их возвращаемые значения для имитации вывода более сложной системы ,
Что я пробовал:
#include "stdafx.h"
//the compiler complains about the '@20'
__declspec ( dllexport ) XLStatus _xlActivateChannel@20(XLportHandle, XLuint64, unsigned int, unsigned int)
{
return 0;
}
// causing the exe to crash
dumpbin / exports vxlapi.dll (оригинальная dll): показывать повторяющиеся имена функций (не для всех функций)
ordinal name
_xlActivateChannel@20
14 xlActivateChannel
Примечание: в заголовочном файле библиотеки DLL функции объявлены так:
DECL_STDXL_FUNC ( xlActivateChannel, XLACTIVATECHANNEL, (
XLportHandle portHandle,
XLaccess accessMask,
unsigned int busType,
unsigned int flags)
);
в дампбине / экспорт dll
почему существуют имена функций, начинающиеся с подчеркивания ‘_’ и заканчивающиеся ‘@number’, обратите внимание: исполняемый файл использует, скажем, (оформленные) функции, и как я могу создать новую dll и экспортировать функции, содержащие @,
«@n» используется stdcall
Соглашение о вызовах. Вам не нужно упоминать это в вашей декларации, вам просто нужно изменить свою декларацию на stdcall
так что компилятор знает, что они должны быть украшены суффиксами «@n». Как это:
__declspec ( dllexport ) XLStatus __stdcall _xlActivateChannel(XLportHandle, XLuint64, unsigned int, unsigned int)
Распределение имен типично для C ++ и т. Д., Поэтому вы видите эти символы в экспорте. Экспорт Ansi C не поврежден. Символ @ не допускается. Вы можете попробовать AT или _AT.
extern «C» используется для удаления искажения для типов C. Is не работает с классом или другими типами C ++.
Я читаю слишком быстро, но Джон более прав.