Аргумент неправильно передан из кода C # в C ++ DLL - PullRequest
0 голосов
/ 04 сентября 2011

Я использую следующий DllImport:

[DllImport(@"someDLL.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern UINT64 someFunc(int arga, int argb, int argc);

Я вызываю функцию следующим образом:

someFunc(0,0,1);

В файле h я объявляю функцию:

extern "C" __declspec(dllexport) UINT64 someFunc(int arga, int argb, int argc);

cpp:

UINT64 someFunc(int arga, int argb, int argc)
{
   ...
}

В коде C ++ я получаю странные значения (например, 1218628, 20140292, 1219020).

Есть идеи почему?

Ответы [ 2 ]

0 голосов
/ 04 сентября 2011

Используйте __stdcall вместо __cdecl, если можете, в __stdcall находится C DLL, которая выполняет очистку стека и является стандартным способом использования DLL-библиотек Windows.

Хорошим поведением является также указание соглашения о вызовах в коде C, как для удобства чтения, так и потому, что в настройках проекта C ++ можно указать, какое соглашение о вызовах используется по умолчанию.

Попробуйте явно установить __cdecl, возможно, компилятор c ++ компилирует его, используя __stdcall.

extern "C" __declspec(dllexport) UINT64 __cdecl someFunc(int arga, int argb, int argc);
0 голосов
/ 04 сентября 2011

Вы не показывали код C ++, поэтому я не вижу проблемы в вашем коде.Итак, я попытался воссоздать его сам.Я создал проект C # WPF, который вызывает в DLL.

C #:

        [DllImport(@"c:\users\owner\documents\visual studio 2010\Projects\MyDll\Release\MyDll.dll",
            CallingConvention = CallingConvention.Cdecl)]
        private static extern UInt64 someFunc(int arga, int argb, int argc); 

        private void DoIt_Click(object sender, RoutedEventArgs e)
        {
            UInt64 val = someFunc(0, 0, 1);
            ResultLabel.Content = val.ToString();
        }

C ++ DLL:

extern "C" __declspec(dllexport) unsigned __int64 someFunc(int arga, int argb, int argc)
{
    CString s;
    s.Format(L"%d\t%d\t%d", arga, argb, argc);
    AfxMessageBox(s);
    return arga + argb + argc;
}

В окне сообщения из C ++ отображается 0 0 1, как ожидается, и код C # возвращается 1, как и ожидалось.

...