Excel, COM, uruchamianie w TServiceApplication

Odpowiedz Nowy wątek
2011-09-26 17:44

Rejestracja: 17 lat temu

Ostatnio: 6 lat temu

0

Witam

Czy walczył ktoś może z użyciem:

x := Create.OleObject('Excel.Application');
...
x.Workbooks.Open('c:\test.xls')

?

Googlowałem ile wlezie, co rusz natrafiałem na opis przekonfigurowywania dostępu w dcomcnfg. Poustawiałem tam maks ile się da (czyli wszystko do wszystkiego ;]), usługę odpalałem na koncie użytkownika zamiast LOCAL SYSTEM. Ostatecznie doprowadziłem do stanu, ze Excel się odpala, i Open chyba też idzie. Ale znowu zaczął mi sie wykrzaczać Excel przy normalnym otwieraniu pliku - no i w usłudze nie idzie dalej po Open. Dzisiaj admin przeinstaluje mi kompa - a pytanie moje jest takie: czy ma ktoś garść dobrych rad w tej materii ?

b

Pozostało 580 znaków

2011-09-26 18:07

Rejestracja: 11 lat temu

Ostatnio: 1 miesiąc temu

Lokalizacja: Poznań

0

Ja używam i nie mam problemów. No chyba że to Win7, to z tym różnie bywało.
Co do porad to w serwisach używam zawsze ścieżek bezpośrednich oraz jeśli odwołujesz się do sieciowego zasobu, to żeby user na który logujesz serwis miał uprawnienia : > No, ale to zapewne wiesz.

otocz w try catch i zapisz treść wyjątku do pliku lub podaj kod :)
Pewnie pisałeś z głowy, bo nie ma kropki w CreateOleObject

edytowany 5x, ostatnio: maciejmt, 2011-09-26 18:11

Pozostało 580 znaków

2011-09-26 19:00

Rejestracja: 17 lat temu

Ostatnio: 6 lat temu

0
maciejmt napisał(a)

Ja używam i nie mam problemów. No chyba że to Win7, to z tym różnie bywało.
Co do porad to w serwisach używam zawsze ścieżek bezpośrednich oraz jeśli odwołujesz się do sieciowego zasobu, to żeby user na który logujesz serwis miał uprawnienia : > No, ale to zapewne wiesz.

otocz w try catch i zapisz treść wyjątku do pliku lub podaj kod :)
Pewnie pisałeś z głowy, bo nie ma kropki w CreateOleObject

maciejmt napisał(a)

Ja używam i nie mam problemów. No chyba że to Win7, to z tym różnie bywało.

To niestety a może stety Vista.

maciejmt napisał(a)

Co do porad to w serwisach używam zawsze ścieżek bezpośrednich oraz jeśli odwołujesz się do sieciowego zasobu, to żeby user na który logujesz serwis miał uprawnienia : > No, ale to zapewne wiesz.

Tu sprawa jest prosta - plik jest na dysku lokalnym. Podaję pełną ścieżkę.

maciejmt napisał(a)

Pewnie pisałeś z głowy, bo nie ma kropki w CreateOleObject

No tak z głowy.

maciejmt napisał(a)

otocz w try catch i zapisz treść wyjątku do pliku lub podaj kod :)

Moja prawdziwa historia jest taka:
TServiceApplication uruchamia do wykonywania poszczególnych zadań osobne wątki. W moim przpadku zadaniem wątku jest preparacja i uruchomienie raportu w FastReport. Ten raport nie nie prezentuje, ale ma pewien kod w OnStartReport który się wykonuje. I w tymże właśnie raporcie (konkretnie jest to FastScript) mam napisany kawałek kodu (Pascal) który to kod:
loguje się do POP3
ściąga mail'a
zapisuje z niego załącznik na dysk
walczę z otwarciem tego pliku i skopiowania jego zawartości
wysyła to przez POST pod pewien adres
wysyła SMS'a z rezultatem wywołania

Wszystko działa - jak odpalam raport jako aplikację. Ale to generalnie może niepotrzebnie piszę o całości. Problem który się pojawił po odpaleniu w usłudze dotyczy Excel'a. W tym fastscripcie nie da się albo nie umię przechwycić komunikatu wyjątku (nie działa On E: Exception do). No więc po trochu robię kod na boku, i testuję. Tyle co zdążyłem wyłapać, to na początek brak CoInitialize - bez tego nie chciał się wogóle tworzyć obiekt. Ale za nim na to wpadłem przegrzebałem i pozmieniałem co mi tylko wpadło w ręce - głównie dcomcnfg. Koniec końców przestał mi działać Excel wogóle. Przed wyjście z roboty, ruszył mi xlsapp.workbook.open, ale nie wiem czego to było rezultatem ... eh. Zanim ruszył komunikat był że nie można otworzyć pliku i podane trzy przyczyny:

  • jest używany przez inną aplikację
  • ścieżka jest nieprawidłowa
  • i jeszcze jedna - ale nie pamiętam

W każdym razie żadna nie była prawdziwa.

Czyli reasumując, powiedz mi tak: u Ciebie w TServiceApplication korzystanie z COM działa od strzała ? Czy musiałeś coś przekonfigurowywać ?

b

Pozostało 580 znaków

2011-09-26 19:08

Rejestracja: 16 lat temu

Ostatnio: 7 lat temu

0

nie wiem czy problemem nie będzie to, że odpalasz OLE w wątku, który nie zainicjował OLE. Spróbuj odpalić CoInitialize na początku i CoUnInitialize na końcu Execute wątku (moduł ActiveX)

tylko pamiętaj aby przypisać nil do wszystkich zmiennych interfejsowych (w Twoim przykładzie np. x) bo inaczej się wysypie CoUninitialize


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
edytowany 1x, ostatnio: Misiekd, 2011-09-26 19:12

Pozostało 580 znaków

2011-09-26 19:26

Rejestracja: 17 lat temu

Ostatnio: 6 lat temu

0
Misiekd napisał(a)

nie wiem czy problemem nie będzie to, że odpalasz OLE w wątku, który nie zainicjował OLE. Spróbuj odpalić CoInitialize na początku i CoUnInitialize na końcu Execute wątku (moduł ActiveX)

tylko pamiętaj aby przypisać nil do wszystkich zmiennych interfejsowych (w Twoim przykładzie np. x) bo inaczej się wysypie CoUninitialize

No to to w końcu rozkminiłem, jak zacząłem robić ten programik na boku. W zasadzie było to proste, bo exception.message był mniej więcej taki: "Funkcja CoInitialize nie została wywołana" : ). Eh jakby wszystkie wylotki były takie.

No ale OK. Przywróciłem wszystko do normalności, Excel mi się zaczął znowu uruchamiać. Kod mam taki:

procedure TExcelTest.ServiceExecute(Sender: TService);
var theApp : OleVariant;
begin
CoInitialize(nil);
try
theApp := CreateOleObject('Excel.Application');
theApp.WorkBooks.Open('f:\test.xls');
except
on E : Exception do
Begin
zapisz E.Message do pliku
End;
end;
CoUnInitialize();
end;

Komunikat:
"
Program Microsoft Office Excel nie może uzyskać dostępu do pliku 'f:\test.xls'. Istnieje kilka możliwych powodów:

• Nazwa pliku lub ścieżka nie istnieje.
• Plik jest używany przez inny program.
• Skoroszyt, który próbujesz zapisać, ma taką samą nazwę jak obecnie otwarty skoroszyt
"

Office 2007
Vista x86

b

Pozostało 580 znaków

2011-09-26 19:36

Rejestracja: 11 lat temu

Ostatnio: 1 miesiąc temu

Lokalizacja: Poznań

0

czy plik który otwierasz, był utworzony na tym samym koncie użytkownika ?

Pozostało 580 znaków

2011-09-26 19:42

Rejestracja: 17 lat temu

Ostatnio: 6 lat temu

0
maciejmt napisał(a)

czy plik który otwierasz, był utworzony na tym samym koncie użytkownika ?

Teraz odpaliłem excel'a utworzyłem plik i zapisałem w tym katalogu - to samo. Tylko że ja to robię na swoim koncie, a usługa działa na koncie SYSTEM. Jak ją przestawiłem na mojego - jest to samo. To samo jest też jak wybiorę Usługa lokalna. Jak wybiorę usługa sieciowa - jest "Odmowa dostępu".

b

Pozostało 580 znaków

2011-09-26 19:53

Rejestracja: 11 lat temu

Ostatnio: 1 miesiąc temu

Lokalizacja: Poznań

0

Jakieś 3 tygodnie temu pisałem o tym, tyle że na Win7.
Własne utworzone pliki odczytywał, utworzone na innym kompie już nie.
Ustawiałem właścicieli, wyłączałem UACa i inne.
Plik mogłem otworzyć np poprzez Read, a poprzez Api Excela już nie, cały czas ten sam komunikat co ty miałeś. Odpuściłem sobie ten temat wtedy(odczytywałem CSVki, więc zrobiłem odczyt przez TStringList). Może to ich bug ? :)

Dostęp do pliku Win7 & aplikacja usługowa

edytowany 2x, ostatnio: maciejmt, 2011-09-26 19:56
Faktycznie problem bardzo podobny, może to to samo. Zaraz sprawdzę jak po wyłączonym UAC'u chociaż nie spodziewam się cudów ... - b0bik 2011-09-26 20:04
Oczywiście bez UAC'a też nie działa - b0bik 2011-09-26 20:14

Pozostało 580 znaków

2011-09-26 19:55

Rejestracja: 16 lat temu

Ostatnio: 7 lat temu

0

udostępnij ten katalog do zapisu dla wszystkich i spróbuj


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-09-26 19:59

Rejestracja: 17 lat temu

Ostatnio: 6 lat temu

0
maciejmt napisał(a)

Odpuściłem sobie ten temat wtedy(odczytywałem CSVki, więc zrobiłem odczyt przez TStringList). Może to ich bug ? :)

No może. Ja niestety nie mam csv.

b

Pozostało 580 znaków

2011-09-26 20:00

Rejestracja: 17 lat temu

Ostatnio: 6 lat temu

0
Misiekd napisał(a)

udostępnij ten katalog do zapisu dla wszystkich i spróbuj

Dodałem 'Wszyscy', pełna kontrola - to samo ; [
b

ja próbowałem wielu ustawień w Windowsie. Jak znajdziesz solucję, to podziel się :) Zawsze jeszcze można napisać na forum Embarcadero. - maciejmt 2011-09-26 20:06
Jak znajdę ... to się podzielę. - b0bik 2011-09-26 20:08

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0