-
привет мастаки! вот возник такой вопрос, в 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? объекты в буфере могут быть не сериализумыми,как тогда узнать их размер? надеюсь на помощь, спасибо.
-
В .NET ситуация примерно следующая. Размер объекта узнавать не нужно, среда выполнения сделает все, что нужно, сама. Класс Clipboard имеет метод SetDataObject, принимающий в качестве параметра ссылку на объект, который вы хотите положить в буфер.
Экземпляр класса, не поддерживающий сериализацию, в буфер обмена поместить нельзя. За исключением Value-типов. Для того, чтобы объект стал сериализуемым, его достаточно пометить атрибутом Serializable и, опционально, реализовать интерфейс ISerializable для того, чтобы самостоятельно управлять процессом сериализации и не забыть объявить дополнительный protected-конструктор для управления десериализацией. Конструктор должен быть объявлен примерно так:
protected MyClass(SerializationInfo info, StreamingContext context) { }
Ну а далее все просто. Clipboard.SetDataObject(new DataObject(pMyObject));
См. также IDataObject, DataObject.
-
дык вот както не совсем так выходит,мне надо как раз GetData, берем например фотошоп,ченить там копируем,а потом делаем примерно так:
MemoryStream memStream = null;
BinaryFormatter bf = null;
IDataObject dataObject = Clipboard.GetDataObject();
string[] formats = dataObject.GetFormats();
foreach (string s in formats)
try
catch (Exception a)
и на некоторых объектах получаем иди нафик :(
-
Ну здрасьте. Во-первых, нужно понимать, что для того, чтобы объект десериализовать, CLR должна знать всё о типе десериализуемого объекта, то бишь иметь загруженной сборку, в которой объявлен тип. Откуда она знает, к какому типу приводить ваш байтовый массив, который поместил в буфер обмена фотошоп, притом, что фотошоп написан вовсе даже и не на С# или там на VB.NET? Во-вторых, объект может быть помещён в буфер обмена в разных представлениях - к примеру, Word помещает в буфер фрагмент текста в формате RTF, HTML, XML, Plain Text, Unicode Plian Text и ещё в нескольких приватных форматах. Приложение, использующее буфер обмена, имеет право помещать в буфер обмена все, что хочет и в любом формате, в каком ему удобно.
-
вот я протоже и говорю,мне безразлично какие там типы объектов,мне надо просто указатель на кусок памяти и размер,чтобы потом все ето безобразие сохранить!
-
Тогда или Clipboard.GetData(), или Interop функций, работающих с буфером. А зачем вам тогда BinaryFormatter?
-
так я получаю только извесные ворматы,а надо все причем повторюсь абсолютно всеравно какие они,просто указатель на кусок памяти и размер! а BinaryFormatter чтоб поглядеть сериализуем объект или нет.
|