long ^ в LONG * преобразование в C ++ / CLI - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть DLL, для которой мне нужно написать оболочку.Цель состоит в том, чтобы использовать его в приложении C # .NET, поэтому мне нужно использовать C ++ / CLI (никогда раньше об этом не читал, поэтому я новичок в этом).

Заголовок функции в dllследующее:

extern "C" __declspec(dllexport) BOOL __stdcall PlayM4_GetPort(LONG* nPort);

Заголовок, который я определил в моей обёртке, выглядит так:

bool PlayM4Wrapper::GetPort(long^ nPort);

Из того, что я понял, знак циркунфлекса (^) означает, что этоуказатель на аргумент (nPort).Поэтому я пытаюсь написать следующий код, но получаю ошибку преобразования Error C2664 'BOOL (LONG *)': el argumento 1 no puede convertirse de 'System::Int32 ^' a 'LONG *'.

bool PlayM4Wrapper::GetPort(long^ nPort)
{
    BOOL ret =_mLoader->m_PlayM4GetPort(nPort);
    return static_cast<BOOL>(ret);
}

Может кто-нибудь помочь мне с этим?Как мне написать эту функцию-обертку?

Спасибо.

1 Ответ

0 голосов
/ 10 декабря 2018

Из того, что я понял, знак циркунфлекса (^) означает, что это указатель на аргумент

Нет понимания C ++ указателя.Да, это ссылка на экземпляр объекта.Но эта ссылка ничего не может использовать в C ++.Это не указатель, и вы не можете использовать его в качестве указателя.Во-первых, long в .NET не является ссылочным типом , поэтому вам это не нужно.Но из сигнатуры вашего метода я предполагаю, что оно используется как скрытое возвращаемое значение, поэтому вам нужно записать в него и для этого действительно нужна ссылка.Поскольку это не ссылочный тип в .NET, вам понадобится другой модификатор, чтобы можно было передать значение обратно:

// equivalent C# signature:
// bool GetPort(ref long nPort) 

bool PlayM4Wrapper::GetPort(long% nPort) 
{
    LONG local = nPort;

    if(_mLoader->m_PlayM4GetPort(&local))
    {
        nPort = local;
        return true;
    }

    return false;
}

Очевидно, % называется ссылка отслеживания .

...