Пользовательский формат данных буфера обмена в RDC (.NET) - PullRequest
1 голос
/ 23 марта 2009

Я пытаюсь скопировать пользовательский объект из окна RDC на хост (мой локальный) компьютер. Это не удается. Вот код, который я использую для 1) копирования и 2) вставки:

1) Удаленный (клиент, работающий на Windows XP, доступ через RDC):

            //copy entry
            IDataObject ido = new DataObject();
            XmlSerializer x = new XmlSerializer(typeof(EntryForClipboard));
            StringWriter sw = new StringWriter();
            x.Serialize(sw, new EntryForClipboard(entry));
            ido.SetData(typeof(EntryForClipboard).FullName, sw.ToString());
            Clipboard.SetDataObject(ido, true);

2) Локальный (клиент работает на локальной рабочей станции Windows XP x64):

                //paste entry
                IDataObject ido = Clipboard.GetDataObject();
                DataFormats.Format cdf = DataFormats.GetFormat(typeof(EntryForClipboard).FullName);

                if (ido.GetDataPresent(cdf.Name)) //<- this always returns false
                {
                    //can never get here!
                    XmlSerializer x = new XmlSerializer(typeof(EntryForClipboard));
                    string xml = (string)ido.GetData(cdf.Name);
                    StringReader sr = new StringReader(xml);
                    EntryForClipboard data = (EntryForClipboard)x.Deserialize(sr);
                }

Хотя он отлично работает на той же машине.

Есть намеки?

Ответы [ 2 ]

1 голос
/ 09 апреля 2009

Хорошо, нашел, в чем проблема. Имена пользовательских форматов усекаются до 16 символов при копировании через RDC с использованием пользовательского формата. В строке

ido.SetData(typeof(EntryForClipboard).FullName, sw.ToString());

имя формата было довольно длинным.

Когда я получал скопированные данные на хост-компьютере, доступные форматы имели мой собственный формат, но урезанные до 16 символов.

IDataObject ido = Clipboard.GetDataObject();
ido.GetFormats(); //used to see available formats.

Итак, я просто использовал более короткое имя формата:

//to copy
ido.SetData("MyFormat", sw.ToString());
...
//to paste
DataFormats.Format cdf = DataFormats.GetFormat("MyFormat");
if (ido.GetDataPresent(cdf.Name)) {
  //this not works
  ...
1 голос
/ 23 марта 2009

Есть несколько вещей, которые вы можете посмотреть:

  1. Вы уверены, что сериализация объекта действительно преобразует его в XML? Возможно, в выведенном XML есть ссылки на ваше пространство памяти? Попробуйте посмотреть текст XML, чтобы увидеть.
  2. Если у вас действительно есть сериализованная XML-версия объекта, почему бы не сохранить значение в виде обычного текста без использования typeof(EntryForClipboard)? Что-то вроде:

    XmlSerializer x = new XmlSerializer(typeof(EntryForClipboard));
    StringWriter sw = new StringWriter();
    x.Serialize(sw, new EntryForClipboard(entry));
    Clipboard.SetText(sw.ToString(), TextDataFormat.UnicodeText);
    

    И затем, все, что вам нужно сделать в клиентской программе, это проверить, можно ли десериализовать текст из буфера обмена обратно в ваш объект.

...