当我尝试使用名称混乱的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;
}
dumpbin的输出:
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
从程序输出中可以看出,传递的最后一个参数与我期望的不完全相同。关于我在做什么错的任何提示吗?