Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C#, Word, win2003Server] COM class factory error

Pagina: 1
Acties:
  • 101 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Vooraf wil ik vast zeggen dat ik niet zeker weet of deze vraag wel in dit forum thuis hoort ;)

Ik heb een C# Console applicatie die een connectie maakt met een Oracle database, daar wat gegevens ophaalt en vervolgens die gegevens in een MS Word 2003 document zet.

Hiervoor gebruik ik de volgende code:
C#:
1
_WordApplication = new Word.Application();

Dit werkt prima op mijn ontwikkelpc (WinXP), maar als ik het draai op de testserver (Window 2003 Server) krijg ik de volgende foutmelding:
code:
1
2
Retrieving the COM class factory for component with 
CLSID {000209FF-0000-0000-C000-000000000046} failed due to the following error: 80070002.


Nu heb ik al gezocht en ik merk dat er meer mensen deze problemen hebben. Het lijkt te liggen aan de security instellingen op de server.
Maar de oplossingen die ik tot nu toe heb gevonden gaan over Word/Excel aanroepen binnen ASP.NET.
Mijn situatie is dat ik ben ingelogd op de Server als administrator en dat ik dan de .exe run.

Het gaat hier overigens om een deelproject. Dit deel moet straks werken in een groter geheel dat als Windows Service moet draaien.

Heeft iemand hier een oplossing voor, want de tot nu toe gevonden oplossingen werken niet.

  • CodeIT
  • Registratie: Juni 2002
  • Laatst online: 10:18

CodeIT

Code IT

error 80070002 is volgens mij "File or component not found". Heb je dezelfde versie van Word op Win2003 geïnstalleerd als op de XP machine?
Je kunt kijken in het registry onder HKEY CLASSES ROOT\Word.Application. Als deze key bestaat, staat het CLSID daar.

[ Voor 34% gewijzigd door CodeIT op 26-07-2007 13:39 ]


Verwijderd

Topicstarter
Op de server staat Office 2003 Standard NL geinstalleerd met voor Word:
00020906-0000-0000-C000-000000000046
Op mijn winXP staat Office 2003 Pro UK met 000209FF-0000-0000-C000-000000000046

Die zijn inderdaad niet gelijk.
Maar dat moet toch op te lossen zijn zonder een herinstallatie van Office?
Kan ik dat niet im mijn code regelen? Of dll's meegeven oid.?

Update:
Ik heb een setup gemaakt van mijn code, maar als ik die wil installeren op de server krijg ik een Windows Installer error dat de service niet gestart is (wat die wel is).
Dat probleem ga ik eerst uitzoeken, hopelijk is dan het versie conflict ook opgelost.

[ Voor 27% gewijzigd door Verwijderd op 26-07-2007 14:54 ]


  • CodeIT
  • Registratie: Juni 2002
  • Laatst online: 10:18

CodeIT

Code IT

Verwijderd schreef op donderdag 26 juli 2007 @ 14:04:
Op de server staat Office 2003 Standard NL geinstalleerd met voor Word:
00020906-0000-0000-C000-000000000046
Op mijn winXP staat Office 2003 Pro UK met 000209FF-0000-0000-C000-000000000046

Die zijn inderdaad niet gelijk.
Maar dat moet toch op te lossen zijn zonder een herinstallatie van Office?
Kan ik dat niet im mijn code regelen? Of dll's meegeven oid.?

Update:
Ik heb een setup gemaakt van mijn code, maar als ik die wil installeren op de server krijg ik een Windows Installer error dat de service niet gestart is (wat die wel is).
Dat probleem ga ik eerst uitzoeken, hopelijk is dan het versie conflict ook opgelost.
Je kan ook meerdere versies ondersteunen in je applicatie, maar dan moet je "late binden" ipv "early binden". Bij early binden wordt bij het compileren bepaald welk com object je gebruikt (vaste GUID dus) en bij late binding kun je zelf adhv de GUID bepalen welk object je laadt.
Het eea inclusief code staat hier goed uitgelegd: http://www.codeproject.co...alatebindingcomevents.asp.

Verwijderd

Topicstarter
@CodeIT:
Heel erg bedankt. Dat lijkt te werken. Ik kan nu inmiddels een Word document open en weer sluiten op de server.
Nu moet ik alleen nog mijn 'Early bind' code omzetten zoals, PrintOut, GotoBookmark, AddPicture.

Ik heb in ieder geval nog genoeg te doen vandaag ;)

Paul

  • CodeIT
  • Registratie: Juni 2002
  • Laatst online: 10:18

CodeIT

Code IT

Verwijderd schreef op vrijdag 27 juli 2007 @ 09:41:
@CodeIT:
Heel erg bedankt. Dat lijkt te werken. Ik kan nu inmiddels een Word document open en weer sluiten op de server.
Nu moet ik alleen nog mijn 'Early bind' code omzetten zoals, PrintOut, GotoBookmark, AddPicture.

Ik heb in ieder geval nog genoeg te doen vandaag ;)

Paul
Het is idd even wat omzetwerk. Kijk wel uit dat er verschillen zijn tussen de verschillende "Word.Application" objecten.
In VB.NET is late binding (vooral events) makkelijker te realiseren dan in C#, dus daar zou je evetueel ook nog eens naar kunnen kijken.

Verwijderd

Topicstarter
Inderdaad is het een hoop omzetwerk. Ik heb het meeste als zoals
OpenDocument
SearchReplace
GotoBookmark
PutText (at selection)
AddPicture (at selection)
Print
SaveAndCloseDocument
Quit

Maar er zijn nog twee puntjes waar ik niet uit kom.

Ik open een document (template), in dat document heb ik al handmatig een tabel met drie kolommen gemaakt. In de eerste cel zit een bookmark.
In mijn code ga ik naar die bookmark en vul tekst of een plaatje in en ga vervolgens naar de volgende cel en vul daar ook weer wat in. Als ik in de derde cel ben en ik ga naar de volgende dan wordt er automatisch een nieuwe rij gemaakt en kan ik verder.
Hiervoor heb ik deze early binding code:
C#:
1
2
Object oUnit = Word.WdUnits.wdCell;
_WordDoc.ActiveWindow.Selection.MoveRight(ref oUnit, ref _missing, ref _missing);

Nu moet ik dit omzetten naar late binding. Dit heb ik al geprobeerd:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
object objSelection = wordType.InvokeMember(
    "Selection",
    BindingFlags.GetProperty,
    null,
    wordApplication,
    new object[]
{
});
//wdCell = 12
wordType.InvokeMember(
    "MoveRight",
    BindingFlags.InvokeMethod,
    null,
    objSelection,
    new object[]
{
    12
});

Maar dit werkt niet. Ik krijg deze error:
code:
1
2
This method or property is not available because some or all of the object
 does not refer to a table.

Als ik naar de Table property kijk dan hebben die wel een index maar ik weet in mijn code de volgorde van de tabellen niet. Ik kan dat misschien truken door het in de bookmarkname te zetten, maar ik vroeg me af of dit niet netter kan.

Het tweede punt is dat ik moet weten of het printen klaar is, omdat ik dan het document kan sluiten en verder kan gaan.
Mijn early binding code:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Make sure all of the documents are gone from the queue
int iTimer = 0;
while (_WordApplication.BackgroundPrintingStatus > 0 && iTimer < 40)
{
    System.Threading.Thread.Sleep(250);
    iTimer++;
}
if (_WordApplication.BackgroundPrintingStatus > 0)
{
    Console.WriteLine("MS Word has timed out for printing the document.");
    return false;

}
else
{
    Console.WriteLine("MS Word is finished printing the document.");
    _WordDoc.Close(ref _false, ref _missing, ref _missing);
    return true;
}


Ik heb dit al voor late binding:
C#:
1
2
3
4
5
6
7
8
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0x56)]
int get_BackgroundPrintingStatus();

public int get_BackgroundPrintingStatus()
{
    Console.WriteLine("get_BackgroundPrintingStatus called.");
    return 0;
}

Maar ik return nu zelf 0 en dat lijkt me niet goed.

Enige duwtjes in de juiste richting zal ik enorm waarderen.
Pagina: 1