2010-02-03 2 views
3

Обновление: эта проблема была устранена.Clipboard Copy-Paste не работает в службе на Win Server 2008/Vista 64bit

вы можете прочитать о решении здесь: Creating a process in a non-zero session from a service in windows-2008-server?

Спасибо всем!


Привет,

Я пытаюсь использовать Clipboard API (в Delphi) для извлечения изображений из документов Word. мой код работает нормально в Windows XP/2003, но в Windows 2008 64 бит это не работает. в win 2008 я получаю сообщение о том, что Clipboard.Formats пуст и не содержит никакого формата.

Изображение, похоже, скопировано в буфер обмена (я вижу его в буфере обмена через Word), но когда я пытаюсь спросить буфер обмена, какой формат он имеет, он сказал, что у него нет никаких форматов.

Как я могу получить доступ к буферу программно на win 2008/Vista? от того, что я знаю 2008 64 бит, это может быть проблемой безопасности ...

вот фрагмент кода:

Это, как я пытаюсь скопировать изображение в буфер обмена:

W.ActiveDocument.InlineShapes.Item(1).Select; // W is a word ole object 
W.Selection.Copy; 

и вот как я пытаюсь вставить его.

Clipboard.Open; 
     Write2DebugFile('FormatCount = ' + IntToStr(Clipboard.FormatCount)); // FormatCount=0 
     For JJ := 1 to Clipboard.FormatCount Do 
      Write2DebugFile('#'+ IntToStr(JJ) + ':' + IntToStr(Clipboard.Formats[JJ])); 
     If (Clipboard.HasFormat(CF_BITMAP)) or 
     (Clipboard.HasFormat(CF_PICTURE)) or 
     (Clipboard.HasFormat(CF_METAFILEPICT)) then // all HasFormat calls returns false. 
     Begin 
     Jpeg := TJPEGImage.Create; 
     Bitmap := TBitmap.Create; 
     Bitmap.LoadFromClipboardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap),0); 
     Jpeg.Assign(Bitmap); 
     Jpeg.SaveToFile(JpgFileN); 
     try Jpeg.Free; except; end; 
     ResizeImage(JpgFileN,750); 
     Write2DebugFile('Saving ' + JpgFileN); 
     End 
     else Write2DebugFile('Doesnt have the right format'); 

Спасибо заранее, Itay

+1

delphi версия? – ulrichb

+0

Мое предположение заключается в том, что Word хранит данные с использованием 64-разрядной памяти, которую не может получить 32-разрядное приложение Delphi. –

+0

также может возникнуть проблема, потому что я запускаю ее как службу ... –

ответ

2

AFAIR, кажется, что M $ не позволяет услуг взаимодействовать с рабочим столом (который нужно использовать буфер обмена) в Win2008.

+1

Из статьи о технике: «В Windows Vista и Windows Server 2008 для устранения этого риска безопасности была удалена поддержка интерактивных сервисов». Статья is technet.microsoft.com/en-us/library/cc756339(WS.10). – DaveE

+1

Fabricio прав, ваш сервис живет в сеансе 0, в то время как экземпляр слова живет в другой сессии. Копировать/вставлять между сеансами невозможно. 64 бит не имеет к этому никакого отношения. Одним из способов решения этой задачи было бы создать процесс в том же сеансе, что и экземпляр слова (http://www.remkoweijnen.nl/blog/2007/10/20/how-to-launch-a-process-in -a-terminal-session /) – Remko

+0

Спасибо Remko ...Да, правильно, я узнал, что слово process запущено в сеансе 3, в то время как исходный exe работает в сеансе 0 (потому что он был запущен службой). Теперь, зная, что моя проблема остается в том, как создать объект ole в сеансе 0, я видел, что можно создать CreateProcess в сеансе 0, указав параметр StartInfo Parameter с именем lpDesktop со следующей строкой «winsta0 \ default». знаете ли вы способ создания объекта ole с этим параметром. Я использую CreateOleObject ('Word.Application'), чтобы создать экземпляр слова. мне это действительно нужно. –