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

Сообщение Re[17]: .Net Core Вызов виртуальных методов нативных объекто от 18.11.2016 13:51

Изменено 18.11.2016 13:57 Serginio1

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


S>> Проблема в том, что ThisCall и stdcall не совместимы.


_>Внимательно смотри выделенное, stdcall (как и cdecl) — это C-стандарт соглашений о вызове, с одинаковой реализацией разными компиляторами,

_>тогда как thiscall — compiler specific — https://en.wikipedia.org/wiki/X86_calling_conventions#thiscall .
_>Тебя все еще интересует linux?

Да волнует. Но компилятор у меня будет один. Опять же я тебе давал ссылку на структуры применяемые в 1С.
Там используется виртуальные методы stdcall.
А вот как это в .Net использовать?
Re[17]: .Net Core Вызов виртуальных методов нативных объекто
Здравствуйте, pilgrim_, Вы писали:


S>> Проблема в том, что ThisCall и stdcall не совместимы.


_>Внимательно смотри выделенное, stdcall (как и cdecl) — это C-стандарт соглашений о вызове, с одинаковой реализацией разными компиляторами,

_>тогда как thiscall — compiler specific — https://en.wikipedia.org/wiki/X86_calling_conventions#thiscall .
_>Тебя все еще интересует linux?

Да волнует. Но компилятор у меня будет один. Опять же я тебе давал ссылку на структуры применяемые в 1С.
Там используется виртуальные методы stdcall.
А вот как это в .Net использовать?

Кстати объявив метод


 [UnmanagedFunctionPointer(CallingConvention.Winapi)]
        internal delegate void ВиртуальныйМетодОбъектаСDelegate(IntPtr self, int Число);

У меня метод вызвался как ThisCall по stdcall

 public static void CallInterface(IntPtr cb)
        {

            var cb2 = Marshal.GetObjectForIUnknown(cb)  as ICallback;

            cb2?.execute(555);

          
            // метод execute в VMT идет 4 (QueryInterface,Addref,Release)
            // а индекс равен 3 
           
            var АдресМетода = ПолучитьАдресВиртуальногоМетода(cb,3);
            // Получим делегат по дресу
            var execute = Marshal.GetDelegateForFunctionPointer<ВиртуальныйМетодОбъектаСDelegate>(АдресМетода);

            // И вызовем метод
            execute(cb, 666);



        }



То есть первый параметр пошел в регисты. Сейчас проверю с несколькими параметрами