SorgenkindMech: COM / DCOM fehler

moins

ich bin mal wieder am verzweifeln ;(

folgende situation:

es geht darum, per PHP einen labeldrucker anzusteuern, was bisher auch immer funktionierte
leider funktioniert es jetzt nicht mehr, und ich weiß nicht, warum, da sich am rechner selbst meines wissens nach nichts geändert hat

das ganze funktioniert folgendermaßen:

es wird eim com-objekt des druckers geladen
danach wird eine template-datei geladen
in dieser werdendie entsprechenden werte verändert, und dann ausgedruckt

dazu folgender php-quelltext:

<?php
ignore_user_abort(1);
if(!isset($_POST['vorlage'])) $_POST['vorlage']="rtv";
$_POST['mnr_datum']=@$_POST['fznr'].@$_POST['mnr'].@$_POST['datum'];
$obj=new COM("BrssCom.Document") or die("<script language='javascript'> alert('Klasse konnte nicht geladen werden'); </script>");
$obj->Open("c:\rtv_p_touch\".$_POST['vorlage'].".lbl") or die("<script language='javascript'> alert('Datei konnte nicht geöffnet werden!'); </script>");
if($_POST['vorlage']=="rtv")
{
 $felder=array("abnr", "fgnr", "mnr_datum");
}
elseif($_POST['vorlage']=="normal")
{
 $felder=array("BARCODE", "artnr", "text1", "text2", "preis");
 $_POST['text1']=substr($_POST['text'],0,37);
 if(strlen($_POST['text'])>28) $_POST['text2']=substr($_POST['text'],37,18);
 else $_POST['text2']="";
 $_POST['preis']=$_POST['preis']."€";
}
elseif($_POST['vorlage']=="name")
{
 $felder=array("NAME");
}
else
{
 die("<script language='javascript'> alert('Es wurde eine falsche Vorlage übergeben!'); </script>");
}
foreach($felder as $feldindex => $feld)
{
 if($feld!="BARCODE")
 {
  $index=$obj->GetTextIndex($feld);
  if($index==-1) die("<script language='javascript'> alert('Fehler beim Finden des Textes ".$feld."!'); </script>");
  else
  {
   $obj->SetText($index, $_POST[$feld]);
   if($feld=="text")
   {

}
  }
 }
 else
 {
  if(!$obj->SetBarcodeData(0, $_POST[$feld]))
  {
   die("<script language='javascript'> alert('Fehler beim Ändern des Barcodes'); </script>");
  }

}
}

if(!isset($_POST['anzahl'])) $_POST['anzahl']=1;

$obj->DoPrint(0,"RTV, ".$_POST['anzahl']);
$obj->Close();
$obj=null;
?>
<script language='javascript'>
// alert("gedruckt");
window.close();
</script>

dieses script lief bisher immer einwandfrei

das Javascrip ist deshalb, weil die datei in einn quasi nicht für den user nicht sichtbaren frame geladen wird

so, und die ausgabe des scripts:

<br />
<b>Fatal error</b>:  Uncaught exception 'com_exception' with message 'Error [0x80020003] Mitglied nicht gefunden.
' in C:\Daten\Roll-tech Verwaltung\rtv.php:5
Stack trace:
#0 C:\Daten\Roll-tech Verwaltung\rtv.php(5): unknown()
#1 {main}
  thrown in <b>C:\Daten\Roll-tech Verwaltung\rtv.php</b> on line <b>5</b><br />

sprich das ist die zeile, wo das objekt erstellt wird ...
ich kenn ja die meldung, von wegen die klasse konnte nicht geladen werden, aber die hier hatte ich noch nich

kleine hintergrund-infos:
OS: winXPPro
PHP: 5.1.2
das com-objekt wird interaktiv ausgeführt und hat für alle vorgänge volle sicherheitsberechtigungen (musste ich damals machen, damit der IIS-Prozess darauf zugreifen kann)
achja, http-server ist IIS 5.1, PHP als ISAPI-Modul

tja, und da steh ich nun und guck dumm aus der wäsche

wär froh wenn da jemand schonmal erfahrungen mit gemacht hat

PS: habe gerade mal das Beispielscript von der doku getestet:

<?php
// Word starten
$word = new COM("word.application") or die("Konnte Word nicht instantiieren");
print "Word geladen, Version \n";

//ein leeres Dokument öffnen
$word->Documents->Add();

//irgendetwas tun
$word->Selection->TypeText("Dies ist ein Test...");
$word->Documents[1]->SaveAs("Useless test.doc");

//Word schließen
$word->Quit();

//Das Objekt freigeben
$word->Release();
$word = null;
?>

(etwas gekürzt)

ausgabe:

Word geladen, Version
Fatal error: Uncaught exception 'com_exception' with message 'Unable to lookup `Documents': Fehler beim Zugriff auf OLE-Registrierung. ' in C:\Daten\Roll-tech Verwaltung\alt\com.php:7 Stack trace: #0 C:\Daten\Roll-tech Verwaltung\alt\com.php(7): unknown() #1 {main} thrown in C:\Daten\Roll-tech Verwaltung\alt\com.php on line 7

tja ....

hoffe jemand weiß was, bis denn dan

  1. Hallo !

    dieses script lief bisher immer einwandfrei

    Dieses "bisher" finde ich interessant.
    Was ist denn zwischen "bisher" und jetzt passiert ?

    Wurde die Komponente, ggf mit axterner Proxy/Stub-dll auch wirklich neu registriert ( regsvr32 <dll> ) ?

    Fatal error: Uncaught exception 'com_exception' with message 'Unable to lookup `Documents': Fehler beim Zugriff auf OLE-Registrierung. ' in

    Es gibt ole-automation-konforme und nicht-konforme Interfaces. Documents ist eine offenbar eine enumeration. Sind das IDocuments oder IDispatches ?
    Gibt's da eine .tlb ?

    Hast Du Word auf dem Server installiert oder nur die dll kopiert ?

    Um das Problem zu isolieren - also insbesondere vom PHP zu loesen - koenntest du' mal mit einem 3-Zeiler in einer ASP -Seite versuchen.

    ( serverseitiges JS )
    var myobj = Server.CreateObject(...);

    Gruss

    Holger

    1. hallöle, danke erstmal für deine antwort

      ich habe mittlerweile herausgefunden, was sich geändert hat, nämlich die PHP-Version

      das script funktioniert mit PHP 5.0.2, aber nicht mit 5.1.2, werde es nachher mit 5.2.0 versuchen

      übrigens das mit word war ja nur ein test, um herauszufinden, ob es mit anderen objekten auch so ist, was sich ja dann rausstellte ...

      das "socuments" ist laut doku des SDKs des druckers so zu verwenden, keine ahnung warum, funktioniert ja auch mit php 5.0.2 ;)

      sowohl 5.0.2 als auch 5.1.2 hatten die gleichen php-ini-einstellungen ... seltsam oder?

      naja, ich werd mal weiter testen ... bis dann erstmal

      1. Hallo !

        hallöle, danke erstmal für deine antwort

        ich habe mittlerweile herausgefunden, was sich geändert hat, nämlich die PHP-Version

        Versionen aendern "sich" nicht, die aendert jemand. Und ich wollte wissen welchee Massnahmendurchgefuehrt wurden.

        das script funktioniert mit PHP 5.0.2, aber nicht mit 5.1.2, werde es nachher mit 5.2.0 versuchen

        übrigens das mit word war ja nur ein test, um herauszufinden, ob es mit anderen objekten auch so ist, was sich ja dann rausstellte ...

        ?!?
        Na ja; sysrtematisch ist diese Art der Fehlersuche nicht.

        das "socuments" ist laut doku des SDKs des druckers so zu verwenden, keine ahnung warum, funktioniert ja auch mit php 5.0.2 ;)

        sowohl 5.0.2 als auch 5.1.2 hatten die gleichen php-ini-einstellungen ... seltsam oder?

        naja, ich werd mal weiter testen ... bis dann erstmal

        Also, Du hast nichts von dem ausprobiert was ich Dir empfohlen hatte und hast meine Rueckfragen nicht beantwortet. Bon.

        Jetzt hast Du aber etwas anderes hearusgefunden und weisst wieder nicht ob das den Fehler verursacht.
        Frohes Suchen !

        Gruss

        Holger

        --
        Aus dem Perl Styleguide:
        "Choose mnemonic identifiers. If you can't remember what mnemonic means, you've got a problem."
        1. Versionen aendern "sich" nicht, die aendert jemand. Und ich wollte wissen welchee Massnahmendurchgefuehrt wurden.

          schon, nur war mir das nichtmehr ebwusst ;)
          zu deinen massnahmen:
          ja es war word auf dem rechner installiert

          das script funktioniert mit PHP 5.0.2, aber nicht mit 5.1.2, werde es nachher mit 5.2.0 versuchen

          übrigens das mit word war ja nur ein test, um herauszufinden, ob es mit anderen objekten auch so ist, was sich ja dann rausstellte ...

          ?!?
          Na ja; sysrtematisch ist diese Art der Fehlersuche nicht.

          naja, je nachdem wie mans sieht
          ich wollte erstmal ausschließen, dass es an dem einen com-objekt liegt, also habe ich ein anderes getestet
          da das auch nicht ging, bin ich dazu übergegangen zu prüfen, ob es vielleicht mit der php-version zusammenhängt

          Also, Du hast nichts von dem ausprobiert was ich Dir empfohlen hatte und hast meine Rueckfragen nicht beantwortet. Bon.

          naja, als ich dann schon herausgefunden hatte, dass es an den verschiedenen php-versionen liegt, war für mich der fall abgeschlossen, sozusagen

          fakt ist:
          php 5.0.2: funktioniert alles
          php 5.1.2: hab ich nichts zum funktionieren bekommen
          php 5.2.0: funktioniert alles

          Jetzt hast Du aber etwas anderes hearusgefunden und weisst wieder nicht ob das den Fehler verursacht.
          Frohes Suchen !

          ähm doch die php-version ... ;)
          was genau mit der 5.1.2 im magen liegt ist mir im moment eigentlich erstmal wurscht, weil funktioniert ja jetz ;)

          oder meinst du es würde sich lohnen, da weiter nachzuforschen?

          Gruss

          Holger

          gruß

          der mech ;)

          1. Hallo !

            oder meinst du es würde sich lohnen, da weiter nachzuforschen?

            Das haengt davon ab, wie wichtig die Anwendung ist.
            Zumindest wuerde ich eine "saubere" Systemkonfiguration anstreben :

            • den "Server" neu installieren. (!)
            • gleich - und nur ! - die funktionsfaehige PHP Version einspielen
            • dann testen.

            Die ganze Installationsprodzedur sauber dokumentieren und ggf verskripten.

            Zuviel Aufwand ?
            Dann sag mir bitte mal aus dem Stehgreif gegen welche MSVCRT Runtime sich Deine aktuelle PHP Version bindet. Oder ist die statisch gebunden?
            :-)
            Welche XML Parser Version vewendet sie ? Bringt sie eine eigene mit ?
            Und ADO ( aks MS Data Access Components ) ? Haben die Vorversionen von PHP vielleicht Bibliotheken nach %SYSTEMROOT%/systems32 installiert ?

            Wenn Du mehrfach Software (de-)installierst hast Du mit etwas Pech am Ende einen gordischen Knoten aus lauter verschiedenen Bibliotheksversionen, den Du nie entflochten kriegst.

            Gruss

            Holger

            --
            Aus dem Perl Styleguide:
            "Choose mnemonic identifiers. If you can't remember what mnemonic means, you've got a problem."