php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 23.04.2009, 00:51  
Neuer Benutzer
 
Registriert seit: 23.04.2009
Beiträge: 1
k_m_becker befindet sich auf einem aufstrebenden Ast
Standard COM Exception "Typkonflikt" bei array parameter by reference

Moin aus Bremen,

folgendes Problem beim Aufruf einer COM-Methode. Die Funktion ist (per com_print_typeinfo()) definiert als:

PHP-Code:
function SyncRead(
   
/* VT_I2 [2] [in] */ $Source,
   
/* VT_I4 [3] [in] */ $NumItems,
   
/* VT_PTR [26] [in] --> VT_SAFEARRAY [27]  */ &$handles,
   
/* VT_PTR [26] [out] --> VT_SAFEARRAY [27]  */ &$Values,
   
/* VT_PTR [26] [out] --> VT_SAFEARRAY [27]  */ &$Errors,
   
/* VT_PTR [26] [out] --> VT_VARIANT [12]  */ &$Qualities,
   
/* VT_PTR [26] [out] --> VT_VARIANT [12]  */ &$TimeStamps
   

// Versuch 1, $p1..$p4 unset:
PHP-Code:
$opcgroup->SyncRead(OPC_DS_CACHEcount($handles), $handles$p1$p2$p3$p4); 
Ergebnis: com_exception: Parameter 4: Typkonflikt.
#0 opc_read_test.php(153): variant->SyncRead(1, 56, Array, NULL, NULL, NULL, NULL)
// ----------------------------------------

// Versuch 2:
PHP-Code:
$p1 = new VARIANT();
$p2 = new VARIANT();
$p3 = new VARIANT();
$p4 = new VARIANT();
$opcgroup->SyncRead(OPC_DS_CACHEcount($handles), $handles$p1$p2$p3$p4); 
Ergebnis: com_exception: Parameter 4: Typkonflikt.
#0 opc_read_test.php(15: variant->SyncRead(1, 56, Array, Object(variant), Object(variant), Object(variant), Object(variant))

// ----------------------------------------

// Versuch 3:
PHP-Code:
$p1 = array();
$p2 = array();
$p3 = array();
$p4 = array();

$opcgroup->SyncRead(OPC_DS_CACHEcount($handles), $handles$p1$p2$p3$p4); 
Ergebnis: com_exception: Parameter 4: Typkonflikt.
#0 opc_read_test.php(15: variant->SyncRead(1, 56, Array, Object(variant), Object(variant), Object(variant), Object(variant))

Ob $p1..$p4 mit oder ohne "&" übergeben werden ändert auch nichts.

Andere Funktionen des gleichen COM-Objekts funktionieren, wenn sie keine arrays per Referenz bekommen sollen.

Generell scheint die Übergabe von Arrays an COM-Objekte by reference nicht zu funktionieren.

Plattform: WinXP, PHP 5.2.9
k_m_becker ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 04.11.2010, 20:06  
Neuer Benutzer
 
Registriert seit: 04.11.2010
Beiträge: 4
PHP-Kenntnisse:
Fortgeschritten
sarux befindet sich auf einem aufstrebenden Ast
Standard Problem mit VT_PTR

Hallo,

ich stehe gerade vor einem ähnlichen Problem. Hast du das Problem lösen können?
Bei mir ist es sogar laut Doku ein C-struct, dass ich als VT_PTR-Parameter übergeben soll.

Gruß, Martin
sarux ist offline   Mit Zitat antworten
Alt 05.11.2010, 00:20  
Erfahrener Benutzer
 
Benutzerbild von fireweasel
 
Registriert seit: 20.03.2010
Beiträge: 469
PHP-Kenntnisse:
Fortgeschritten
fireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblick
fireweasel eine Nachricht über ICQ schicken fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken fireweasel eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von sarux Beitrag anzeigen
Hallo,

ich stehe gerade vor einem ähnlichen Problem. Hast du das Problem lösen können?
Bei mir ist es sogar laut Doku ein C-struct, dass ich als VT_PTR-Parameter übergeben soll.

Gruß, Martin
Erstmal machen Referenzen in PHP sowieso meist mehr Probleme als sie lösen. Zweitens ist Call-by-Reference in der COM-Extension seit der PHP-Version 5 nicht mehr nötig. Sie erkennt (laut Handbuch soll sie es zumindest) selbstständig, ob eine Variable an ein COM-Objekt per Referenz (innerhalb COM) weitergegeben werden muss.

Zitat:
Generell scheint die Übergabe von Arrays an COM-Objekte by reference nicht zu funktionieren.
Pauschale Aussage. Würde ich so nicht unterschreiben. Aber ohne das COM-Objekt zu kennen, was der OP verwendet hat, wird es schwierig, Vergleiche anzustellen.
__________________
Foreach ist auch eine Schleife!
fireweasel ist offline   Mit Zitat antworten
Alt 05.11.2010, 11:40  
Neuer Benutzer
 
Registriert seit: 04.11.2010
Beiträge: 4
PHP-Kenntnisse:
Fortgeschritten
sarux befindet sich auf einem aufstrebenden Ast
Standard Referenz

Hallo,

danke für deine Antwort!

Dann ist also das Problem, wie verpacke ich meine Daten richtig?
Ich habe das COM-Objekt in VB ausprobiert und festgestellt, dass in der dll ein VB-Type definiert wird, der dann der Methode übergeben wird. Das entspricht einem C-Struct.
Kann man denn in PHP ein in einem COM-Objekt definierten Typ anlegen?

Mir ist noch eine Alternative eingefallen: Eine Excel-Datei anlegen, die über Makros die Methoden des COM-Objekts aufruft. Excel-Datei mit PHP öffnen geht ja, mich trennt jetzt nur noch das Ausführen eines Makros von meinem Ziel.
Kann man über PHP und Excel-COM-Objekt einen Button fernklicken, bzw. kann man ein Makro direkt ausführen?

Gruß, Martin
sarux ist offline   Mit Zitat antworten
Alt 10.11.2010, 20:48  
Erfahrener Benutzer
 
Benutzerbild von fireweasel
 
Registriert seit: 20.03.2010
Beiträge: 469
PHP-Kenntnisse:
Fortgeschritten
fireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblick
fireweasel eine Nachricht über ICQ schicken fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken fireweasel eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von sarux Beitrag anzeigen
Hallo,
Dann ist also das Problem, wie verpacke ich meine Daten richtig?
Ich habe das COM-Objekt in VB ausprobiert und festgestellt, dass in der dll ein VB-Type definiert wird, der dann der Methode übergeben wird. Das entspricht einem C-Struct.
Kann man denn in PHP ein in einem COM-Objekt definierten Typ anlegen?
Keine Ahnung, das Problem ist mir so noch nicht untergekommen. PHP kennt nur zwei Arten von "structs". Das eine sind die Arrays mit Strings als Key. Das andere wäre ein mit pack() erzeugter Binärdatenstring. Falls in der C-Struct Zeiger vorkommen, dürfte das aber scheitern, weil PHP-Quellcode von Zeigern ja nichts weiß.

Zitat:
Mir ist noch eine Alternative eingefallen: Eine Excel-Datei anlegen, die über Makros die Methoden des COM-Objekts aufruft. Excel-Datei mit PHP öffnen geht ja, mich trennt jetzt nur noch das Ausführen eines Makros von meinem Ziel.
Kann man über PHP und Excel-COM-Objekt einen Button fernklicken, bzw. kann man ein Makro direkt ausführen?
Pffffft, wenn das COM-Objekt so eine Möglichkeit kennt, sollte das klappen. Falls du keine Doku hast, das schon erwähnte com_print_typeinfo() hilft (meistens) weiter.

Eine andere Möglichkeit wäre vielleicht, Excel über den Scripting-Host anzusprechen. Der hat auch ein COM-Objekt.

Wenn du auf PHP verzichten kannst, darfst du auch mal einen Blick auf AutoIt werfen. Das kann mit C-Structs besser umgehen. Außerdem ist es direkt für die Automatisierung von Anwendungen geschrieben.
__________________
Foreach ist auch eine Schleife!
fireweasel ist offline   Mit Zitat antworten
Alt 11.11.2010, 10:47  
Neuer Benutzer
 
Registriert seit: 04.11.2010
Beiträge: 4
PHP-Kenntnisse:
Fortgeschritten
sarux befindet sich auf einem aufstrebenden Ast
Standard Structs und Excel

Zitat:
Zitat von fireweasel Beitrag anzeigen
Keine Ahnung, das Problem ist mir so noch nicht untergekommen. PHP kennt nur zwei Arten von "structs". Das eine sind die Arrays mit Strings als Key. Das andere wäre ein mit pack() erzeugter Binärdatenstring. Falls in der C-Struct Zeiger vorkommen, dürfte das aber scheitern, weil PHP-Quellcode von Zeigern ja nichts weiß.
Das habe ich beides schon probiert, ebenso eine Klasse, die einfach nur die Variablen vorsieht. Ein Problem dabei ist ja auch, dass SHORTs vorgesehen sind, PHP aber nur Integers kennt, und soviel ich weiß, sind die Integers länger.

Zitat:
Zitat von fireweasel Beitrag anzeigen
Pffffft, wenn das COM-Objekt so eine Möglichkeit kennt, sollte das klappen. Falls du keine Doku hast, das schon erwähnte com_print_typeinfo() hilft (meistens) weiter.
Das habe ich inzwischen gefunden. Das COM-Objekt bietet die Methode Run mit dem Makro-Namen als Argument.

Zitat:
Zitat von fireweasel Beitrag anzeigen
Eine andere Möglichkeit wäre vielleicht, Excel über den Scripting-Host anzusprechen. Der hat auch ein COM-Objekt.
Welche Vorteile hat der gegenüber Excel direkt ansprechen?

Zitat:
Zitat von fireweasel Beitrag anzeigen
Wenn du auf PHP verzichten kannst, darfst du auch mal einen Blick auf AutoIt werfen. Das kann mit C-Structs besser umgehen. Außerdem ist es direkt für die Automatisierung von Anwendungen geschrieben.
Ganz kann ich nicht auf PHP verzichten, aber wenn ich irgendwie von PHP Daten übergeben und Ergebnisse empfangen kann, wäre das vielleicht eine Möglichkeit. Ich schaue es mir mal an.


Meine momentane Lösung: Excel-Datei gebastelt, die für jede Methode, die ich benötige, eine Tabelle mit Input- und Output-Parametern anbietet. Zu jeder Methode ein Makro, dass die Input-Parameter in den Struct packt, die Methode aufruft und das Ergebnis zurück in die Output-Zellen schreibt. In PHP öffne ich das Excel, fülle die Input-Zellen, rufe das Makro auf und hole mir die Ergebnisse aus den Output-Zellen.
Für den Moment funktioniert es, wenn ich eine bessere Lösung finde, werde ich es darauf umbauen.

Danke jedenfalls!
sarux ist offline   Mit Zitat antworten
Alt 11.11.2010, 20:14  
Erfahrener Benutzer
 
Benutzerbild von fireweasel
 
Registriert seit: 20.03.2010
Beiträge: 469
PHP-Kenntnisse:
Fortgeschritten
fireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblick
fireweasel eine Nachricht über ICQ schicken fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken fireweasel eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von sarux Beitrag anzeigen
Das habe ich beides schon probiert, ebenso eine Klasse, die einfach nur die Variablen vorsieht. Ein Problem dabei ist ja auch, dass SHORTs vorgesehen sind, PHP aber nur Integers kennt, und soviel ich weiß, sind die Integers länger.
pack() kennt einige Datentypen mehr als PHP selbst. Für SHORT-Integers gäbe es da unter anderen 'v' (little endian) und 'i'. Die "nackten" Integers von PHP selbst kann man eventuell über den Umweg Variant konvertieren, wenn man den passenden Variant-Typen kennt (da ist die PHP-COM-Doku äußerst lückenhaft).

Zitat:
Welche Vorteile hat der gegenüber Excel direkt ansprechen?
Meine Vermutung: Die benutzte Sprache (VBS, JScript, ...) hat hoffentlich bessere Möglichkeiten, C-Structs an COM-Objekte zu übergeben als PHP.
__________________
Foreach ist auch eine Schleife!
fireweasel ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Array umwandeln von zwei zu mehrdimensional erselbst PHP Tipps 2009 6 02.04.2009 23:30
Erneut Vorstellung meiner Seite. litterauspirna Off-Topic Diskussionen 11 16.02.2009 19:17
Array Reference erselbst PHP Tipps 2009 7 10.01.2009 22:02
array als Parameter? Hape42 PHP Tipps 2008 8 07.12.2008 20:37
Turnierbaum aus array erstellen kingflo PHP-Fortgeschrittene 11 30.07.2008 11:32
Soapfault: Undefined Property Argi PHP-Fortgeschrittene 0 28.07.2008 11:17
Übersicht aus mehrdimensionalem Array erzeugen Crypi PHP-Fortgeschrittene 0 30.01.2006 13:44
Array auslesen andrew22 PHP Tipps 2006 3 21.01.2006 23:06
Array Formatierung PHP Tipps 2006 3 17.01.2006 19:12
Menü mit Unterpunkten supertramp Beitragsarchiv 7 18.10.2005 22:40
Problem beim vergleichen von 2 Arrays PHP Tipps 2005-2 1 06.10.2005 14:25
Sortieren von Arrays mit mehr als 2 Dimensionen (Teil 2) Buhmann PHP-Fortgeschrittene 4 12.07.2005 14:03
Mehrdimensionales Array in eindimensionales Array umwandeln PHP-Fortgeschrittene 3 03.01.2005 22:31
Abfrage mit id aus anderer Tabelle suter PHP Tipps 2004-2 15 16.12.2004 14:25

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php com_exception, javascript typkonflikt, com_exception typenkonflikt php, opcgroup.syncread, com exception, php reference, parameter 0: typkonflikt, php com vt_ptr, php variant array, com_exception php, php typkonflikt., variant vt_ptr, php vt_ptr, typkonflikt javascript, opcgroup php, vt_ptr variant, php übergabeparameter array, typkonflikt, php array übergabeparameter, php variant object to array

Alle Zeitangaben in WEZ +1. Es ist jetzt 21:44 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum