dllimport: переданный аргумент поврежден при использовании искаженных имен - PullRequest
0 голосов
/ 08 февраля 2019

В моей попытке использовать 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

Как видно из вывода программы, последний параметрпрошло не совсем то, что я ожидаю.Любые намеки на то, что я делаю не так?

...