Re[14]: [ANN] WinRT - новое компонентное API для Windows 8
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 02.10.11 22:21
Оценка:
Здравствуйте, MxMsk, Вы писали:

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


D>>>Может быть они и нормальные, только вот в COM о них надо постоянно думать...

_>>Постоянно думать о подсчёте ссылок надо в C++. В языках с поддержкой IUnknown на уровне компилятора (напр. Delphi) это делается автоматически.
MM>Проблемы не в том, чтобы автоматизировать вызовы AddRef и Release. Проблема в том, как быть уверенным, что всё это согласуется с внешним кодом, который не ты пишешь и не ты поддерживаешь.

Если внешний код корректно делает addref и release, то какая тебе разница? А если неорректно, то опять нет разницы несколько корректно это делаешь ты или компилятор за тебя.
Re[15]: [ANN] WinRT - новое компонентное API для Windows 8
От: MxMsk Португалия  
Дата: 02.10.11 22:47
Оценка: +1
Здравствуйте, gandjustas, Вы писали:

G>Если внешний код корректно делает addref и release, то какая тебе разница? А если неорректно, то опять нет разницы несколько корректно это делаешь ты или компилятор за тебя.

Правильно. Поэтому нафиг reference counting. Другого я и не говорил.
Re[16]: [ANN] WinRT - новое компонентное API для Windows 8
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 02.10.11 22:56
Оценка: -1 :)
Здравствуйте, MxMsk, Вы писали:

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


G>>Если внешний код корректно делает addref и release, то какая тебе разница? А если неорректно, то опять нет разницы несколько корректно это делаешь ты или компилятор за тебя.

MM>Правильно. Поэтому нафиг reference counting. Другого я и не говорил.
Как раз наоборот, нужно делать свое дело (addref и release) и не париться как делают подсчет ссылок компоненты.
Re[11]: [ANN] WinRT - новое компонентное API для Windows 8
От: Lloyd Россия  
Дата: 02.10.11 23:08
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>А тот же компилятор C# — я (хотя и пишу меньше двух месяцев) уже натыкался на конструкции которые VS2010 может откомилировать, а 2008 тупит — надо подсказывать.


Можно подробнее?
Re[11]: [ANN] WinRT - новое компонентное API для Windows 8
От: fddima  
Дата: 03.10.11 07:28
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>И это видно по допиливанию такой тривиальной вещи как IntPtr. Сложно было сразу его сделать полноценную реализацию что ли?

А что с текущей не так? Да и вообще в C# есть нормальные указатели.
Re[12]: [ANN] WinRT - новое компонентное API для Windows 8
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 03.10.11 16:03
Оценка: :)
Здравствуйте, fddima, Вы писали:

F>Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>>И это видно по допиливанию такой тривиальной вещи как IntPtr. Сложно было сразу его сделать полноценную реализацию что ли?

F> А что с текущей не так? Да и вообще в C# есть нормальные указатели.

Сложения IntPtr с целыми числами. По-моему оно отсутствует как класс. Какой-то зародыш появился в NET4.
При том при всем, что они юзают IntPtr для указания адреса памяти. Ну так сразу и добавили бы к нему все, что нужно для счастья.

Нет возможности определить верхнее/нижнее значения IntPtr (иногда нужно для контроля переполнения)

Вообщем, я плюнул, и накатал свои алгоритмы для IntPtr. Текущий вариант (без претензий на идеал) выглядит так:
  Скрытый текст
////////////////////////////////////////////////////////////////////////////////
using IntPtr_NumType         =System.Int64;
using IntPtr_UnsignedNumType =System.UInt64;
////////////////////////////////////////////////////////////////////////////////
//class intptr_utils

public static class intptr_utils
{
 private const ste_err_src_id c_src_id=ste_err_src_id.intptr_utils;

 //-----------------------------------------------------------------------
 public static readonly IntPtr_NumType Zero
  =0;

 public static readonly IntPtr_NumType MaxValue
  =t_intptr_utils__data.GetProvider().MaxValue;

 public static readonly IntPtr_NumType MinValue
  =t_intptr_utils__data.GetProvider().MinValue;

 //-----------------------------------------------------------------------
 public static IntPtr_NumType ToNumeric(IntPtr x)
 {
  return x.ToInt64();
 }//ToNumeric

 //-----------------------------------------------------------------------
 public static IntPtr ToIntPtr(IntPtr_NumType x)
 {
  if(!(MinValue<=x && x<=MaxValue))
   throw_sys_error.arithmetic_overflow(c_src_id,"ToIntPtr__NumType",x);

  return (IntPtr)x;
 }//ToIntPtr

 //IntPtr+UInt32 ---------------------------------------------------------
 public static IntPtr Add(IntPtr a,UInt32 b)
 {
  Debug.Assert(MinValue<0);
  Debug.Assert(MaxValue>0);

  var a1=ToNumeric(a);
  var b1=b;

  while(b1>MaxValue)
  {
   if(a1>0)
    throw_sys_error.arithmetic_overflow(c_src_id,"Add__IntPtr_UInt32",a,b);

   a1+=MaxValue;
   b1-=(UInt32)MaxValue;
  }//while b1>MaxValue

  Debug.Assert(b1>=0);
  Debug.Assert(b1<=MaxValue);

  Debug.Assert(a1>=MinValue);
  Debug.Assert(a1<=MaxValue);

  if(a1>=0)
  {
   if((MaxValue-a1)<b1)
    throw_sys_error.arithmetic_overflow(c_src_id,"Add__IntPtr_UInt32",a,b);
  }//a1>=0

  return (IntPtr)(a1+((IntPtr_NumType)b1));
 }//Add - IntPtr+UInt32

 //-----------------------------------------------------------------------
 public static IntPtr Add(UInt32 a,IntPtr b)
 {
  return Add(b,a);
 }//Add - UInt32+IntPtr

 //IntPtr+UInt64 ---------------------------------------------------------
 public static IntPtr Add(IntPtr a,UInt64 b)
 {
  Debug.Assert(MinValue<0);
  Debug.Assert(MaxValue>0);

  var a1=ToNumeric(a);
  var b1=b;

  while(b1>((IntPtr_UnsignedNumType)MaxValue))
  {
   if(a1>0)
    throw_sys_error.arithmetic_overflow(c_src_id,"Add__IntPtr_UInt64",a,b);

   a1+=MaxValue;
   b1-=(IntPtr_UnsignedNumType)MaxValue;
  }//while b1>MaxValue

  Debug.Assert(b1>=0);
  Debug.Assert(b1<=((IntPtr_UnsignedNumType)MaxValue));

  Debug.Assert(a1>=MinValue);
  Debug.Assert(a1<=MaxValue);

  if(a1>=0)
  {
   if(((IntPtr_UnsignedNumType)(MaxValue-a1))<b1)
    throw_sys_error.arithmetic_overflow(c_src_id,"Add__IntPtr_UInt64",a,b);
  }//a1>=0

  return (IntPtr)(a1+((IntPtr_NumType)b1));
 }//Add - IntPtr+UInt64

 //-----------------------------------------------------------------------
 public static IntPtr Add(UInt64 a,IntPtr b)
 {
  return Add(b,a);
 }//Add - UInt64+IntPtr
 
 //IntPtr+Int32 ----------------------------------------------------------
 public static IntPtr Add(IntPtr a,Int32 b)
 {
  Debug.Assert(MinValue<0);
  Debug.Assert(MaxValue>0);

  if(b>=0)
   return Add(a,(UInt32)b);

  return Sub(a,remove_numeric_sign.exec(b));
 }//Add - IntPtr+Int32

 //-----------------------------------------------------------------------
 public static IntPtr Add(Int32 a,IntPtr b)
 {
  return Add(b,a);
 }//Add - Int32+IntPtr

 //IntPtr+UIntPtr --------------------------------------------------------
 public static IntPtr Add(IntPtr a,UIntPtr b)
 {
  Debug.Assert(MinValue<0);
  Debug.Assert(MaxValue>0);

  var a1=ToNumeric(a);
  var b1=uintptr_utils.ToNumeric(b);

  while(b1>((IntPtr_UnsignedNumType)MaxValue))
  {
   if(a1>0)
    throw_sys_error.arithmetic_overflow(c_src_id,"Add__IntPtr_UIntPtr",a,b);

   a1+=MaxValue;
   b1-=(IntPtr_UnsignedNumType)MaxValue;
  }//while b1>MaxValue

  Debug.Assert(b1>=0);
  Debug.Assert(b1<=((IntPtr_UnsignedNumType)MaxValue));

  Debug.Assert(a1>=MinValue);
  Debug.Assert(a1<=MaxValue);

  if(a1>=0)
  {
   if(((IntPtr_UnsignedNumType)(MaxValue-a1))<b1)
    throw_sys_error.arithmetic_overflow(c_src_id,"Add__IntPtr_UIntPtr",a,b);
  }//a1>=0

  return (IntPtr)(a1+((IntPtr_NumType)b1));
 }//Add - IntPtr+UIntPtr

 //-----------------------------------------------------------------------
 public static IntPtr Add(UIntPtr a,IntPtr b)
 {
  return Add(b,a);
 }//Add - UIntPtr, IntPtr

 //-----------------------------------------------------------------------
 public static IntPtr Sub(IntPtr a,UInt32 b)
 {
  Debug.Assert(MinValue<0);
  Debug.Assert(MaxValue>0);
  Debug.Assert(MaxValue==-(MinValue+1));

  var a1=ToNumeric(a);
  var b1=b;

  if(a1>=0)
  {
   if(a1>=b1)
    return (IntPtr)(a1-((IntPtr_NumType)b1));

   b1-=(UInt32)a1;
   a1=0;
  }//if a1>0

  Debug.Assert(a1<=0);

  while(b1>MaxValue)
  {
   Debug.Assert(a1>=MinValue);
   Debug.Assert(a1<=MaxValue);

   if(a1<0)
    throw_sys_error.arithmetic_overflow(c_src_id,"Sub__IntPtr_UInt32",a,b);

   a1-=MaxValue;
   b1-=(UInt32)MaxValue;
  }//while b>MaxValue

  Debug.Assert(a1<=0);
  Debug.Assert(a1>=MinValue);
  Debug.Assert(b1<=MaxValue);

  if(a1<0)
  {
   if((a1-MinValue)<b1)
    throw_sys_error.arithmetic_overflow(c_src_id,"Sub__IntPtr_UInt32",a,b);
  }//if a1<0

  return (IntPtr)(a1-((IntPtr_NumType)b1));
 }//Sub - IntPtr, UInt32

 //private data ----------------------------------------------------------
 private static readonly t_intptr_utils__provider
  sm_Impl=t_intptr_utils__data.GetProvider();
}//class intptr_utils

Нечто аналогичное сделано и для UIntPtr.

Нормальные указатели — это в unsafe. Так? Или я что то пропустил?

Еще этот Marshal, который не понимает беззнаковые числа. Ну сложно было что ли сразу замутить? Чтобы любой, кто пришел с плюсов, почувствовал себя как дома. Нет — нехай помучается. Очередная надстройка c unsafe методами. Там как раз нормальные указатели юзаются

Сегодня разбирался с сериализацией. Опять какая-та лажа. Нафига мне нужно указывать (километровые) типы — выводите из значений параметров! C# же позволяет. Опять свой код.
  Скрытый текст
public static class serialization_utils
{
 public static void read_value<T>(SerializationInfo si,string name,out T value)
 {
  Debug.Assert(si!=null);
  Debug.Assert(name!=null);
  Debug.Assert(name!="");

  value=(T)si.GetValue(name,typeof(T));
 }//read_value

 //-----------------------------------------------------------------------
 public static void write_value<T>(SerializationInfo si,string name,T value)
 {
  Debug.Assert(si!=null);
  Debug.Assert(name!=null);
  Debug.Assert(name!="");

  si.AddValue(name,value,typeof(T));
 }//write_value
}//class serialization_utils

Во. Меня еще заколбасило от того, что StringBuilder.Clear появился только в NET4. Это жесть

Нормальных алгоритмов поиска по ключу в List я не нашел. Нужны алгоритмы которые бы работали с (а-ля) IComparer<T1,T2>. Плохо искал? Опять свой код.

---
Наверное, я где то загнался. Но по-другому желаемое пока реализовать не удается

Да, это всего лишь бурчание по поводу того, что "опять все надо делать самому, своими руками"
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[13]: [ANN] WinRT - новое компонентное API для Windows 8
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 03.10.11 16:09
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Наверное, я где то загнался. Но по-другому желаемое пока реализовать не удается


КД>Да, это всего лишь бурчание по поводу того, что "опять все надо делать самому, своими руками"


Что же ты такое реализовать пытаешься и главное зачем?
Re[12]: [ANN] WinRT - новое компонентное API для Windows 8
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 03.10.11 16:56
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>>А тот же компилятор C# — я (хотя и пишу меньше двух месяцев) уже натыкался на конструкции которые VS2010 может откомилировать, а 2008 тупит — надо подсказывать.


L>Можно подробнее?


Воспроизвести это можно так.
  Скрытый текст
using System;
using System.Collections.Generic;

////////////////////////////////////////////////////////////////////////////////

interface IProcessor2<T1,T2>
{
};

////////////////////////////////////////////////////////////////////////////////
//class utils

class utils
{
 public static void exec<T1,T2>(IList<T1> list,T2 key,IProcessor2<T1,T2> proc)
 {
 }
}//utils

////////////////////////////////////////////////////////////////////////////////
//processors

class TProcessor:IProcessor2<string,int>,IProcessor2<Guid,int>
{
};//class TProcessor

////////////////////////////////////////////////////////////////////////////////

class Program
{
 static int Main()
 {
  var list_str=new List<string>();
  var list_guid=new List<Guid>();

  var proc=new TProcessor();

  int n=0;
  
  //VS2010 - ok.
  
  //VS2008 - fail
  //Ошибка    1    Аргументы-типы для метода
  //"utils.exec<T1,T2>(System.Collections.Generic.IList<T1>, T2, IProcessor2<T1,T2>)"
  //не должны определяться по использованию. Попытайтесь явно определить аргументы-типы.
  
  utils.exec/*<string,int>*/(list_str,n,proc);
  utils.exec/*<Guid,int>*/(list_guid,n,proc);
  
  return 0;
 }//Main
}//class Program

Не спрашивай — "а нафига я засунул в один класс две разных реализации IProcessor2?". Так получилось
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[12]: [ANN] WinRT - новое компонентное API для Windows 8
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 03.10.11 17:54
Оценка: :)
Здравствуйте, MxMsk, Вы писали:

MM>Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>>>>1. при нормальном подходе с ними никто не возится. как не возятся с голыми указателями на память, к примеру.

MM>>>Нормальный подход — это какой?
КД>>1. смарт-указатели. с правильной реализацией. или это уже не актуально?
КД>>2. правильные принципы владения объектами. У COM они нормальные.
MM>Правильное на правильном. Вот это и называется возиться. Всегда нужно применять только правильное и только с правильной реализацией. А мне нравится просто создавать объекты, без оберток, борющихся с языком.

Ты не поверишь — я вообще не парюсь с такими вещами. Последние траблы были так давно, что я уже забыл когда именно Правда опять же — я по-большому счету варился в собственном котле. С UI-шным ActiveX я соприкасался только один раз. Когда прикручивал Forms от офиса к своей системе. Из чужих COM-ов только ScriptControl+MSXML+ADODB. Наверное из-за этого минимализма у меня все и работало. Внутри же, все, то есть абсолютно все (что движется) — на счетчиках ссылок. Плюс жесточайший контроль обнулений/освобождений и прочего, что может намекать на утечку ресурсов. На плюсах по-другому писать как-то тяжко. Но зато спишь спокойно.

А я вот сейчас морально готовлюсь бороться с Dispose. Конкретнее — запрещать его вызов, пока работает один из методов объекта.

То что при подсчете ссылок делается автоматом (тот кто вызывает метод объект, удерживает его в памяти), на .NET прийдется реально городить: try/finally + CER. В КАЖДОМ PUBLIC-МЕТОДЕ!

Подобная защита предоставляется SafeHandle. Между вызовами DangerousAddRef/DangerousRelease — хоть обвызывайся Dispose. Но, если был вызов Dispose, последний DangerousRelease освободит объект.

--
Но я пока не уверен, что я тут все правильно понимаю. Хотя, как защиту от многопоточного дурака, я думаю такое все таки прийдется делать
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[12]: [ANN] WinRT - новое компонентное API для Windows 8
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 03.10.11 18:01
Оценка:
Здравствуйте, drol, Вы писали:

D>Вы бы ещё пожаловались, что на .NET драйвера разрабатывать затруднительно


Пожалуй я так и сделаю
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[13]: [ANN] WinRT - новое компонентное API для Windows 8
От: MxMsk Португалия  
Дата: 03.10.11 18:14
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>То что при подсчете ссылок делается автоматом (тот кто вызывает метод объект, удерживает его в памяти), на .NET прийдется реально городить: try/finally + CER. В КАЖДОМ PUBLIC-МЕТОДЕ!

Это почему же?
Re[14]: [ANN] WinRT - новое компонентное API для Windows 8
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 03.10.11 18:19
Оценка: :)
Здравствуйте, MxMsk, Вы писали:

MM>Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>>То что при подсчете ссылок делается автоматом (тот кто вызывает метод объект, удерживает его в памяти), на .NET прийдется реально городить: try/finally + CER. В КАЖДОМ PUBLIC-МЕТОДЕ!

MM>Это почему же?

Опппа. А что в .NET можно замутить триггеры на вызовы/завершения методов?
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[15]: [ANN] WinRT - новое компонентное API для Windows 8
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 03.10.11 18:20
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Здравствуйте, MxMsk, Вы писали:


MM>>Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>>>То что при подсчете ссылок делается автоматом (тот кто вызывает метод объект, удерживает его в памяти), на .NET прийдется реально городить: try/finally + CER. В КАЖДОМ PUBLIC-МЕТОДЕ!

MM>>Это почему же?

КД>Опппа. А что в .NET можно замутить триггеры на вызовы/завершения методов?


А зачем тебе?
Re[13]: [ANN] WinRT - новое компонентное API для Windows 8
От: hi_octane Беларусь  
Дата: 03.10.11 18:23
Оценка: +3
КД>Во. Меня еще заколбасило от того, что StringBuilder.Clear появился только в NET4. Это жесть

На StringBuilder наезд совершенно не по делу. До NET4 можно было просто Length в 0 установить, и получить тот же Clear. Или тебе принципиально метод нужен?
Re[14]: [ANN] WinRT - новое компонентное API для Windows 8
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 03.10.11 18:40
Оценка: :)))
Здравствуйте, hi_octane, Вы писали:

КД>>Во. Меня еще заколбасило от того, что StringBuilder.Clear появился только в NET4. Это жесть


_>На StringBuilder наезд совершенно не по делу. До NET4 можно было просто Length в 0 установить, и получить тот же Clear. Или тебе принципиально метод нужен?


И получается — чтобы код компилировался и там и там, про Clear можно забыть. Нафиг его тогда вообще добавили? Короче, я юзаю установку нуля. А наезд чисто на изначальный интерфейс — Clear должен был быть с самого рождения.

Я вообще сижу под VS2010 и генерирую код под NET4. А 2008 (NET3.5) я юзаю чисто как средство для доп. проверок. Привычка такая — чем нибудь еще откомпилировать и проверить. Вот и обнаруживаются такие вот забавные вещи.

---
Опять же. Заморочка с двумя компиляторами — это мои личные тараканы. На плюсах я в качестве альтернативы юзал BCB5. Но он у меня (окончательно) рехнулся за пару месяцев до релиза
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: [ANN] WinRT - новое компонентное API для Windows 8
От: AngeL B. Россия  
Дата: 03.10.11 18:49
Оценка:
Здравствуйте, Gollum, Вы писали:

G> Некоторой частью эти расширения похожи на расширения managed C++, но не нужно их путать. WinRT не использует CLR, и несмотря на то, что синтаксис местами одинаковый (например, Search::QueryOptions^), в WinRT это означает совсем другое.


Одна синтаксическая конструкция имеющая разный смысл при разных ключах компилятора (то есть по сути два разных языка) очевидно один из самых быстрых путей к полному .....
И вопрос тут не в том, что ребята решили создать новый COM. Может он и нужен для низкоуровневых работ, а именно в том, что они решили продлить агонию С++ превратив его из кошмарного франкенштейна (чего стоит синтаксис лямбд) с замусоренным синтаксисом в нечто совсем уж убожеское. Надо было создавать новый язык. Пусть низкоуровневый, но новый.
И лично я считаю, что это может очень плохо сказаться на отрасли в целом и на компании MS в частности.
Печально
Re[15]: [ANN] WinRT - новое компонентное API для Windows 8
От: MxMsk Португалия  
Дата: 03.10.11 19:03
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Опппа. А что в .NET можно замутить триггеры на вызовы/завершения методов?

Какую задачу решаем?
Re[16]: [ANN] WinRT - новое компонентное API для Windows 8
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 03.10.11 19:21
Оценка: :)))
Здравствуйте, MxMsk, Вы писали:

MM>Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>>Опппа. А что в .NET можно замутить триггеры на вызовы/завершения методов?

MM>Какую задачу решаем?

"запрещать (или откладывать) вызова Dispose, пока работает один из методов объекта"


То есть запретить другим потокам освобождать объект, пока его юзает другой поток.

Речь идет о дополнительной защите. Понятно, что потоки сами должны предотвращать такое безобразие. Но тем не менее.

Про lock(...){} я знаю. Но по-моему можно обойтись и без этой синхронизации. Такая задача, я думаю, вполне решабельна на уровне ... счетчика ссылок и interlocked-функций
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[3]: [ANN] WinRT - новое компонентное API для Windows 8
От: x64 Россия  
Дата: 03.10.11 19:23
Оценка:
КД>Я думаю он сам хорошо понимает — "если что, то лучше самому себе сделать харакири"

В таком случае, ему пора начинать готовиться к ритуалу, я думаю.
Re: [ANN] WinRT - новое компонентное API для Windows 8
От: x64 Россия  
Дата: 03.10.11 19:40
Оценка:
Всё же, я думаю, это в раздел Win32 надо было. Потому что вот меня, например, больше беспокоит вопрос: зачем это всё, в смысле, какую цель преследует этот WinRT и какие задачи/проблемы призван решить? Почему не .Net просто? Они же могли сказать, мол, с сегодняшнего дня все, кто хотят кодить прикладные вещи, будете кодить их на C#, VB или на худой конец C++/CLI, а всякие там MFC и вообще нативные вещи объявляем устаревшими и оставляем только для всяческих системных разработок. И всё, всем сразу стало бы понятно, что к чему. Но зачем нужен новый C++? Зачем нужен COM (не важно в каком виде), если есть .Net? Короче, может кто-нибудь вразумительно ответить на эти вопросы? Если вопрос не понятен, тогда спрошу конкретнее. Представим, что я технический директор софтовой компании, которому заказали определённый софт написать, ну, скажем, аналог какого-нибудь там Office, вопрос: на чём его писать? Я ведь могу взять C# и не парится, или взять MFC и опять же не парится, или могу взять голый Windows API, если я конченный извращенец, и получать своё извращенческое удовольствие, потому что я знаю, что в итоге с помощью данных инструментов я смогу сделать всё, что мне нужно. Но внезапно я узнаю, что появился какой-то там ещё WinRT, а чем он лучше для моей задачи, — мне не понятно, что мне делать?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.