2010-02-03 5 views
3

업데이트 :이 문제가 해결되었습니다.Windows Server 2008/Vista 64 비트 서비스에서 클립 보드 복사 - 붙여 넣기가 작동하지 않습니다.

여기에 솔루션에 대해 읽을 수 있습니다 : Creating a process in a non-zero session from a service in windows-2008-server?

감사합니다 모두!


안녕

,

나는 Word 문서에서 이미지를 추출하기 (델파이) 클립 보드 API를 사용하는 것을 시도하고있다. Windows XP/2003에서는 제 코드가 정상적으로 작동하지만 Windows 2008에서는 64 비트가 작동하지 않습니다. win 2008에서 Clipboard.Formats가 비어 있으며 형식이 포함되어 있지 않다는 오류가 표시됩니다.

이미지가 클립 보드에 복사 된 것처럼 보이지만 (클립 보드에서 Word로 볼 수 있음) 클립 보드에 어떤 형식으로 요청했는지에 관계없이 형식이 없다는 메시지가 나타납니다.

어떻게하면 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

델파이 버전? – ulrichb

+0

내 생각 엔 Word가 32 비트 Delphi 앱이 액세스 할 수없는 64 비트 메모리를 사용하여 데이터를 저장하고있는 것 같습니다. –

+0

또 다른 문제는 내가 서비스로 실행하고 있기 때문일 수 있습니다 ... –

답변

2

AFAIR는 M $가 서비스 Win2008에서 (클립 보드를 사용하는 데 필요한되는) 데스크톱과 상호 작용하도록 허용하지 않습니다 나타납니다.

+1

기술 문서 "Windows Vista 및 Windows Server 2008에서이 보안 위험을 완화하기 위해 대화 형 서비스 지원이 제거되었습니다"문서는 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

감사합니다 ...네, 맞습니다. 나는 원래의 exe가 세션 0에서 실행되고있는 동안 (프로세스에 의해 실행 되었기 때문에) 세션 3에서 word 프로세스가 실행 중임을 알게되었습니다. 이제는 내 문제가 세션 0에서 OLE 개체를 만드는 방법으로 남아 있다는 것을 알고 있으므로 세션 0에서 CreateProcess를 다음 문자열 'winsta0 \ default'로 시작 매개 변수 인 StartInfo를 지정하여 가능하다는 것을 알았습니다. 이 매개 변수를 사용하여 ole 객체라는 단어를 인스턴스화하는 방법을 알고 계십니까? 나는 단어를 인스턴스화하기 위해 CreateOleObject ('Word.Application')를 사용하고있다. 나는 정말로 그것을 필요로한다. –