CakeFest 2024: The Official CakePHP Conference

PHP ve COM

PHP, Win32 platformlarında COM ve DCOM nesnelere erişim için kullanılabilir.

Bazı hesaplamalar için bir DLL derledim. Bu DLL'li PHP altında çalıştırmanın bir yolu var mı?

Bu basit bir DLL ise bunu PHP altında çalıştırmanın bir yolu yoktur. Eğer DLL bir COM sunucusu içeriyor ve IDispatch arayüzünü gerçekliyorsa bu DLL'e erişebilirsiniz.

'Unsupported variant type: xxxx (0xxxxx)' iletisinin anlamı nedir?

Düzinelerce VARIANT türü ve bunların birleşimleri vardır. Bunların çoğu desteklenmekteyse de bir kısmı halen gerçeklenme aşamasındadır. Diziler tamamen desteklenmemektedir. PHP ve COM arasında sadece tek boyutlu diziler aktarılabilmektedir. Lütfen bunu bir hata olarak raporlayın (hala raporlanmamışsa) ve bunu yaparken mümkün olduğunca fazla bilgi verin.

PHP'de görsel nesnelerle çalışmak mümkün müdür?

Genelde mümkündür, fakat PHP'deki gibi çoğunlukla HTTP sunucusu bağlamında işlem yapan bir betik dili olarak kullanılırlar. Bu bakımdan görsel nesneler hiçbir zaman sunucunun masaüstünde görünmezler. PHP'yi uygulama yazmak için kullanacaksanız (PHP-GTK örneğinde olduğu gibi), görsel nesnelerle COM üzerinden çalışmak için herhangi bir sınırlama yoktur.

Bir COM nesnesini bir oturumda saklayabilir miyim?

Hayır, saklayamazsınız. COM nesne örnekleri birer özkaynak olarak ele alınır. Bu bakımdan sadece tek betiklik bir bağlamda kullanılabilirler.

COM hatalarını yakalayabilir miyim?

COM eklentisi sizin de yakalayabileceğiniz com_exception istisnalarını yakalar. Bundan sonra ne yapılacağını belirlemek için code üyesini inceleyebilirsiniz.

COM hatalarını PHP tarafından sağlanan yollarla (@, track_errors, ...) yakalamak mümkün değildir.

Perl'de olduğu gibi PHP betiklerinden DLL dosyaları üretebilir miyim?

Hayır, maalesef PHP'de böyle bir araç yoktur.

'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}' iletisininin anlamı nedir?

Bu hata pek çok sebepten ortaya çıkabilir:

  • CLSID yanlıştır.
  • İstenen DLL yoktur.
  • İstenen bileşen IDispatch arayüzünü gerçeklemiyordur.

Bir COM nesnesini bir uzak sunucudan nasıl çalıştırabilirim?

Tıpkı bir yerel nesne gibi çalıştırabilirsiniz. Tek yapacağınız, COM kurucusuna ikinci bağımsız değişken olarak uzak makinenin IP adresini aktarmaktır.

php.ini dosyanızda com.allow_dcom=true atamasını yapmış olmalısınız.

'DCOM is disabled in C:\path...\scriptname.php on line 6' iletisini alıyorum. Ne yapabilirim?

php.ini dosyanızı düzenlemek için açıp com.allow_dcom=true atamasını yapın.

Bir ActiveX nesnesini PHP ile bir sayfaya yüklemek ve kullanmak mümkün müdür?

Bunun için PHP ile bir şey yapılamaz. HTML belge tarafından istendikleri takdirde ActiveX nesneler istemci tarafında yüklenirler. PHP betiğiyle bir ilgileri olmadığından sunucu taraflı doğrudan etkileşim mümkün değildir.

Bir bileşenin çalışan bir örneğini almak mümkün müdür?

Bu, takma adların yardımı ile mümkündür. Aynı yazı örneği için çok sayıda başvuru edinmek için örneği şöyle oluşturabilirsiniz:I

<?php
$yazı
= new COM("C:\docs\yazı.doc");
?>

Çalışan bir örnek olmadığı takdirde bu yeni bir örnek oluşturur, aksi takdirde çalışan örnek için bir başvuru döndürür.

COM nesnesinden gönderilen bir olayı işleme sokmanın bir yolu var mıdır?

Bir olay alıcıyı tanımlayabilir ve bunu com_event_sink() kullanarak bağlayabilirsiniz. PHP'nin olay alıcı sınıfının bir iskeletini üretmesi için com_print_typeinfo() işlevini kullanabilirsiniz.

Birden fazla arayüz içeren bir COM nesnesinin bir yöntemini çağırmaya çalışırken sorunlarla karşılaşıyorum. Ne yapabilirim?

Yanıt pek tatmin edici değil biliyorum. Aslında tam olarak ne yapılacağını bilmiyorum ama yapılabilecek bir şeyler olmalı. Bu konuda bilgisi olar biri varsa lütfen » bana bildirsin. :)

PHP, COM ile çalıştığına göre COM+ ile de çalışır, değil mi?

COM+, COM'un bileşenlerini MTS ve MSMQ üzerinden yönetmek için bir arayüz ile genişletir. PHP'nin bu tarz nesneleri desteklemesi için yapacağı özel bir şey yoktur.

PHP, COM nesnelerle çalıştığına göre, özkaynakları yönetmek üzere MTS'yi PHP ile birlikte kullanmayı düşünebilir miyiz?

PHP henüz MTS hareketlerini işleme sokamamaktadır. Bu bakımdan, bir hata oluşursa hareketi başa sarmak mümkün değildir. MTS hareketlerini destekleyen bileşenleri kullanmak niyetindeyseniz hareket yönetimini kendiniz gerçeklemek zorundasınız.

add a note

User Contributed Notes 3 notes

up
9
Anonymous
18 years ago
Re: The Windows English CHM Sample with MS Word Automation.

I see that $Word->Release() is called after $Word->Quit().
This seems to be erroneous. Actually, $Word->Release() should not have to be called if proper COM garbage collection is taking place. Release() is a C++ construction not used in either Visual Basic or VBScript or even MS-JScript. Just to be sure, however, I ran the sample through php.exe (5.04 CLI on Windows XP SP1 with Office 2003) and got a RPC failed error on the line containing $Word->Release(). The rest of the sample works fine, and the results are as expected. So, I propose 2 scenarios:
1.There is a problem with the documentation (more likely).
2.There is a problem with PHP504 itself, as this problem is reproduced with any COM Automation call, not just Word.
up
7
junk.ghost@virgin dOtt net
19 years ago
It may be obvious to everyone else but...

If you want to write your own COM DLL in MSVC++6 and you want to pass it a string, you need the following in your .idl file:

HRESULT function_name([in] BSTR parameter_name,
[retval, out] BSTR * retval);

retval is the result of your function as a string to be passed back.

BSTR is an unsigned short *, so if you want to use your string with STL string etc. you may need to convert parameters to and from char *.

The burden of my message is that from PHP

$comThing = new COM("comThing.comThing");
print $comThing->function_name("Jeremy");

Jeremy will be marshalled as wide chars, which match BSTR.
up
3
codeslinger at compsalot dot com
17 years ago
in response to item #1 above: "If this is a simple DLL there is no way yet to run it from PHP."

Answer: There are several different packages/add-ons to php that enable low level access to the windows api. One of the most popular of these packages is available at http://www.winbinder.org

Winbinder does have the ability to load a dll and call it's functions. Winbinder also provides a large set of windows apis for creating windows and controls. This is useful for creating stand-alone desktop apps. It is a possible alternative to php-gtk.

I've had mixed results with Winbinder, some things work very well, others are buggy; source code is available. It's worth a look, Evaluate carefully.
To Top