Информация об изменениях

Сообщение Re[9]: [Offtop] Вызов принят! от 15.06.2016 8:41

Изменено 15.06.2016 9:19 Serginio1

Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, mDmitriy, Вы писали:


D>>Учитывая, что вся семантика шарпа на латинице (как это ни странно), любители непрерывно переключать раскладку несколько удивляют...


S>Ну так сказано же:

S>

S>С моим кодом пока работаю только я один.

S>Если человека устраивает, что ни в одном проекте подобный код не примут и даже читать не будут — зачем спорить?

Главное работает и мне понятно. Вопрос где могут быть еще подводные камни.
Наверняка найдутся в режиме эксплуатации.

Поэкспериментировал с CallBack


[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
         delegate void myDelegate(IntPtr thisptr);

 public static void TestCallBack(IntPtr Str,IntPtr FuncPtr)
        {

            myDelegate fun = (myDelegate)Marshal.GetDelegateForFunctionPointer(FuncPtr, typeof(myDelegate));

            fun(Str);
        }



На С++

typedef void(STDMETHODCALLTYPE *ManagedTestCallBack)(const wchar_t*, void(*) (const wchar_t*));

ManagedTestCallBack pTestCallBack;


hr = CreateDelegate2(pCLRRuntimeHost, domainId, L"CoreClrDLL", L"CoreClrDLL.Program", L"TestCallBack", (INT_PTR*)&pTestCallBack);
    if (FAILED(hr))
    {
        printf_s("Failed to create a delegate to the managed entry point: (%d).\n", hr);

    }
    else
    {
        wchar_t* str = L"Test str from unmanaged";
        pTestCallBack(str, TestCallBack);
    }


Работает. Так что можно память выделять на стороне натива и использовать обратные вызовы.
Здравствуйте, Sinix, Вы писали:


S>Если человека устраивает, что ни в одном проекте подобный код не примут и даже читать не будут — зачем спорить?


Главное работает и мне понятно. Вопрос где могут быть еще подводные камни.
Наверняка найдутся в режиме эксплуатации.

Поэкспериментировал с CallBack


[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
         delegate void myDelegate(IntPtr thisptr);

  public static void TestCallBack(IntPtr Str,IntPtr FuncPtr)
        {

            myDelegate fun = (myDelegate)Marshal.GetDelegateForFunctionPointer<myDelegate>(FuncPtr);

            fun(Str);

            var str = Marshal.PtrToStringUni(Str);
        }



На С++

typedef void(STDMETHODCALLTYPE *ManagedTestCallBack)(const wchar_t*, void(*) (const wchar_t*));

ManagedTestCallBack pTestCallBack;


hr = CreateDelegate2(pCLRRuntimeHost, domainId, L"CoreClrDLL", L"CoreClrDLL.Program", L"TestCallBack", (INT_PTR*)&pTestCallBack);
    if (FAILED(hr))
    {
        printf_s("Failed to create a delegate to the managed entry point: (%d).\n", hr);

    }
    else
    {
        wchar_t* str = L"Test str from unmanaged";
        pTestCallBack(str, TestCallBack);
    }


Работает. Так что можно память выделять на стороне натива и использовать обратные вызовы.