В моей попытке использовать DLL с искаженными именами я вижу странное, но непротиворечивое поведение, когда последний переданный аргумент поврежден / неинициализирован.
Когда я компилирую код ниже, используя 'extern "C"«Это работает нормально, но мне бы очень хотелось, чтобы была возможность перегруженных методов, следовательно, использование искаженных имен.Все скомпилировано в 64-битном формате.
MyDll.h:
#define MYDLL_API __declspec(dllexport)
class myDll
{
public:
MYDLL_API int Add(int, int);
MYDLL_API int Sub(int, int);
};
myDll.cpp:
int myDll::Add(int a, int b)
{
printf("a is %d, b is %d\n", a, b);
return a + b;
}
int myDll::Sub(int a, int b)
{
printf("a is %d, b is %d\n", a, b);
return a - b;
}
Вывод из дампа:
Dump of file .\myDll.dll
File Type: DLL
Section contains the following exports for myDll.dll
00000000 characteristics
FFFFFFFF time date stamp
0.00 version
1 ordinal base
2 number of functions
2 number of names
ordinal hint RVA name
1 0 0001101E ?Add@myDll@@QEAAHHH@Z = @ILT+25(?Add@myDll@@QEAAHHH@Z)
2 1 0001131B ?Sub@myDll@@QEAAHHH@Z = @ILT+790(?Sub@myDll@@QEAAHHH@Z)
Приложение, в которое я импортирую DLL, написано на C #
namespace UseMyDll
{
class Program
{
static void Main(string[] args)
{
int a = Add(1, 2);
int b = Sub(2, 1);
}
[DllImport("myDll.dll",
EntryPoint = "?Add@myDll@@QEAAHHH@Z",
ExactSpelling = true,
CallingConvention = CallingConvention.Cdecl)]
public static extern int Add(int a, int b);
[DllImport("myDll.dll",
EntryPoint = "?Sub@myDll@@QEAAHHH@Z",
ExactSpelling = true,
CallingConvention = CallingConvention.Cdecl)]
public static extern int Sub(int a, int b);
}
}
Вывод из программы C #:
a is 2, b is -1588955232
a is 1, b is -1588955232
Как видно из вывода программы, последний параметрпрошло не совсем то, что я ожидаю.Любые намеки на то, что я делаю не так?