Конференция ".Net" » буфер обмена [C#, WinXP]
 
  • SEvgeniy (24.05.06 11:12) [0]
    привет мастаки!
    вот возник такой вопрос, в unmanaged содержимое буфера обмена можно было получить примерно так:


    UINT format = 0;
    format = ::EnumClipboardFormats(format);
    HANDLE hMem = ::GetClipboardData(format);
    UINT size = ::GlobalSize(hMem);
    LPVOID pMem = ::GlobalLock(hMem);
    LPVOID buf = new byte[size];
    memcpy(buf, pMem, size);



    и дальше буфер можно сохранить на диск итд.
    так вот вопрос как сделать тоже самое в managed? объекты в буфере могут быть не сериализумыми,как тогда узнать их размер?
    надеюсь на помощь, спасибо.
  • Ломброзо © (24.05.06 11:30) [1]
    В .NET ситуация примерно следующая.
    Размер объекта узнавать не нужно, среда выполнения сделает все, что нужно, сама.
    Класс Clipboard имеет метод SetDataObject, принимающий в качестве параметра ссылку на объект, который вы хотите положить в буфер.

    Экземпляр класса, не поддерживающий сериализацию, в буфер обмена поместить нельзя. За исключением Value-типов.
    Для того, чтобы объект стал сериализуемым, его достаточно пометить атрибутом Serializable и, опционально, реализовать интерфейс ISerializable для того, чтобы самостоятельно управлять процессом сериализации и не забыть объявить дополнительный protected-конструктор для управления десериализацией. Конструктор должен быть объявлен примерно так:

    protected MyClass(SerializationInfo info, StreamingContext context)
    {
    }

    Ну а далее все просто.
    Clipboard.SetDataObject(new DataObject(pMyObject));

    См. также IDataObject, DataObject.
  • SEvgeniy (24.05.06 11:35) [2]
    дык вот както не совсем так выходит,мне надо как раз GetData, берем например фотошоп,ченить там копируем,а потом делаем примерно так:

               MemoryStream memStream = null;
               BinaryFormatter bf = null;
               IDataObject dataObject = Clipboard.GetDataObject();
               string[] formats = dataObject.GetFormats();
               foreach (string s in formats)
               {
                   //Console.WriteLine(s);

                   object o = Clipboard.GetData(s);
                   if (o == null)
                   {
                       //continue;
                   }

                   try
                   {
                       memStream = new MemoryStream();
                       bf = new BinaryFormatter();
                       bf.Serialize(memStream, o);
                       Console.WriteLine(s + " is serialized");
                   }

                   catch (Exception a)
                   {
                       Console.WriteLine("serialize test: " + s + " " + a.Message);
                   }

         


    и на некоторых объектах получаем иди нафик :(
  • Ломброзо © (24.05.06 11:53) [3]
    Ну здрасьте.
    Во-первых, нужно понимать, что для того, чтобы объект десериализовать, CLR должна знать всё о типе десериализуемого объекта, то бишь иметь загруженной сборку, в которой объявлен тип. Откуда она знает, к какому типу приводить ваш байтовый массив, который поместил в буфер обмена фотошоп, притом, что фотошоп написан вовсе даже и не на С# или там на VB.NET?
    Во-вторых, объект может быть помещён в буфер обмена в разных представлениях - к примеру, Word помещает в буфер фрагмент текста в формате RTF, HTML, XML, Plain Text, Unicode Plian Text и ещё в нескольких приватных форматах. Приложение, использующее буфер обмена, имеет право помещать в буфер обмена все, что хочет и в любом формате, в каком ему удобно.
  • SEvgeniy (24.05.06 12:03) [4]
    вот я протоже и говорю,мне безразлично какие там типы объектов,мне надо просто указатель на кусок памяти и размер,чтобы потом все ето безобразие сохранить!
  • Ломброзо © (24.05.06 12:12) [5]
    Тогда или Clipboard.GetData(), или Interop функций, работающих с буфером. А зачем вам тогда BinaryFormatter?
  • SEvgeniy (24.05.06 12:23) [6]
    так я получаю только извесные ворматы,а надо все причем повторюсь абсолютно всеравно какие они,просто указатель на кусок памяти и размер! а BinaryFormatter чтоб поглядеть сериализуем объект или нет.
 
Конференция ".Net" » буфер обмена [C#, WinXP]
Есть новые Нет новых   [120162   +162][b:0][p:0.002]