Memanggil DLL dari PHP


Pada suatu hari, seorang mahasiswa yang sedang menyusun skripsi menanyakan pada saya apakah mungkin mengakses DLL dari kode program PHP.  Sebuah pertanyaan yang tidak terduga, karena saya sama sekali tidak pernah dan tidak berpikiran untuk melakukan hal tersebut.  Hal ini karena PHP adalah bahasa pemograman yang berada di banyak platform, gratis, dan sangat populer di Linux.  Sementara teknologi DLL adalah teknologi yang sangat terikat pada Microsoft Windows serta Visual Studio-nya.  Menurut saya, pertanyaan ‘membaca DLL‘ akan lebih selaras bila dipadukan dengan teknologi ASP.NET dengan bahasa C# ataupun VB, dibandingkan dengan PHP.

Kembali ke pertanyaan semula, apakah mungkin memanggil DLL dari PHP? Setelah melakukan pencarian di PHP Manual, saya menemukan bagian COM and .Net (Windows) yang dapat diakses di www.php.net/manual/en/book.com.php.  PHP memang mendukung Component Object Model (COM) dan .NET.  Lalu apa hubungan COM dan DLL?

  • DLL (Dynamic-link Library) adalah implementasi shared-library di platform Windows.  Programmer membuat fungsi yang dapat dipanggil ulang di program berbeda.
  • COM (Component Object Model) adalah sebuah metodologi yang mengatur bagaimana menerapkan komponen program yang dapat dipakai ulang di program berbeda.
  • COM tidak mengatur struktur bahasa yang dipakai (menurut referensi MSDN, COM sering salah kaprah diangagp sebagai OOP).
  • Implementasi COM umumnya dalam bentuk file DLL.
  • Tidak semua DLL dibuat berdasarkan aturan COM, atau dengan kata lain tidak semua DLL adalah COM.

Jadi  jawaban untuk mahasiswa tersebut adalah: bila DLL dibuat dengan menggunakan teknologi COM, maka DLL tersebut dapat diakses di PHP.  Bila DLL tersebut adalah DLL sederhana, maka DLL tersebut tidak dapat diakses di PHP.

Lalu bagaimana bila ingin tetap mengakses DLL sederhana di PHP?  Ada sebuah extension PHP yang dikhususkan untuk Windows yang bernama WinBinder.  Dengan WinBinder, programmer PHP dapat memanggil semua APIs Windows dengan PHP, membuat program GUI berbasis PHP, bahkan memanggil DLL sederhana (tanpa COM) dengan PHP.

Pada artikel ini, saya akan menggunakan teknologi sebagai berikut:

  • Visual C++ di Visual Studio 2010 untuk menghasilkan DLL yang mengikuti spesifikasi COM.
  • Memakai ATL (Active Template Library) di Visual C++ untuk membuat COMATL bukan bagian dari COM ataupun bahasa C++ melainkan sebuah framework sebagai bagian dari Visual C++ untuk mempermudah pembuatan COM.
  • PHP untuk mengakses DLL yang dihasilkan oleh Visual C++

Untuk membuat COM di Visual C++ dengan bantuan ATL, pilih menu File, New, Project di Visual Studio 2010.  Kemudian pada Visual C++, pilih ATL Project.  Beri nama pada project tersebut, misalnya LatihanCOM.  Tentukan juga lokasi folder untuk penyimpanan project tersebut.  Kemudian klik tombol OK.

Membuat Project ATL Baru

Membuat Project ATL Baru

Akan muncul ATL Project Wizard yang terdiri atas dua langkah.  Klik tombol Next pada wizard tersebut.  Pastikan pada Application Type, pilihan Dynamic-link library (DLL) terpilih.  Kemudian klik tombol Finish untuk membuat project.

ATL Project Wizard

ATL Project Wizard

Setelah project selesai dibuat, buka panel Class View.  Bila panel ini tertutup, pilih menu View, Class View (Ctrl+Shift+C) untuk menampilkannya.  Klik kanan pada nama project, LatihanCOM, kemudian pilih Add, Class…  Pada window Add Class yang muncul, pilih ATL Simple Object.  Kemudian klik tombol Add untuk melanjutkan.

Tampilan Dialog Add Class

Tampilan Dialog Add Class

Pada tampilan ATL Simple Object Wizard yang muncul, ketik nama Perhitungan di Short name.  Nama lain akan di-isi secara otomatis.  Pastikan bahwa di bagian COM, nama Interface adalah IPerhitungan.  Kemudian isi ProgID dengan nama Jocki.Perhitungan.  Window tersebut harus terlihat seperti berikut ini:

ATL Simple Object Wizard

ATL Simple Object Wizard

Klik tombol Finish untuk menyelesaikan wizard.

Buka panel Class View dan cari COM Interface yang bernama IPerhitungan.  Interface ini dibuat secara otomatis oleh Visual C++ sehingga yang perlu kita lakukan hanya menambahkan method yang akan dipanggil oleh program lain.  Klik kanan pada IPerhitungan, kemudian pilih Add, Add Method…

Menambah Method Pada COM Interface

Menambah Method Pada COM Interface

Pada dialog Add Method Wizard yang muncul, kita akan membuat sebuah method sederhana.  Method ini akan menerima parameter berupa dua buah bilangan bulat, kemudian mengembalikan hasil jumlah dua bilangan tersebut.  Pada method name, beri nama HitungJumlah.  Kemudian tambahkan dua parameter input dengan mengikuti langkah ini:

  1. Beri centang pada checkbox in di Parameter attributes.
  2. Ketik int di Parameter type.
  3. Ketik nilai1 di Parameter name.
  4. Klik tombol Add.
  5. Beri centang pada checkbox in di Parameter attributes.
  6. Ketik int di Parameter type.
  7. Ketik nilai2 di Parameter name.
  8. Klik tombol Add.

Setelah menambahkan parameter, tambahkan nilai kembalian dengan mengikuti langkah ini:

  1. Ketik int* di Parameter type.  Jangan lupa menambahkan * setelah int karena variabel ini akan merujuk ke hasil kembalian (pointer).  Bila tidak ada * setelah int, wizard tidak akan memberikan pilihan untuk mencentang checkbox out dan retval di langkah berikutnya.
  2. Beri tanda centang checkbox out dan checkbox retval.
  3. Ketik hasil pada Parameter name.
  4. Klik tombol Add.

Tampilan wizard akan terlihat seperti berikut ini:

Tampilan Add Method Wizard

Tampilan Add Method Wizard

Klik tombol Finish untuk menyelesaikan wizard.

Cari baris kode program seperti berikut ini di file Perhitungan.cpp:

STDMETHODIMP CPerhitungan::HitungJumlah(int nilai1, int nilai2, int* hasil)
{
// TODO: Add your implementation code here

return S_OK;
}

Kode program ini merupakan implementasi dari method yang akan dipanggil oleh PHP nantinya.  Ganti baris yang diawali dengan //TODO sehingga kode programnya akan terlihat seperti berikut ini:

STDMETHODIMP CPerhitungan::HitungJumlah(int nilai1, int nilai2, int* hasil)
{ *hasil = nilai1 + nilai2;

return S_OK;
}

Langkah terakhir sebelum menghasilkan DLL adalah melakukan sedikit perubahan pada settingan project.  Buka panel Solution Explorer.  Bila panel ini tertutup, pilih menu View, Solution Explorer (Ctrl+Alt+L).  Klik kanan pada nama project, LatihanCOM, kemudian pilih Properties.  Pada baris Per-user Redirection, ganti nilai No menjadi Yes.  Hal ini dilakukan untuk menghindari hal-hal yang berkaitan dengan masalah hak akses user.  Dengan mengaktifkan Per-user Redirection, DLL yang dihasilkan hanya akan tersedia oleh user Windows yang sedang aktif saat ini saja.

Untuk membuat DLL, pilih menu Build, Build Solution (Ctrl+Shift+B).  File DLL yang dihasilkan terletak di folder Debug di lokasi penyimpanan project.  Sebagai contoh, jika saya menyimpan project di Desktop, maka file DLL yang dihasilkan adalah C:\Users\JockiHendry\Desktop\LatihanCOM\Debug\LatihanCOM.dll.  Visual C++ 2010 telah melakukan registrasi DLL secara otomatis sehingga kita tidak perlu repot-repot lagi.

Sekarang, kita akan melakukan pengujian apakah DLL tersebut dapat dipanggil dengan baik.  Buat sebuah file PHP dengan isi seperti berikut ini:

<?php
   $perhitungan = new COM("Jocki.Perhitungan");
   $hasil = $perhitungan->HitungJumlah(11,22);
   print "Hasil dari method di COM DLL adalah $hasil";
?>

Bila kode program PHP di atas dijalankan, hasilnya adalah:

Hasil dari method di COM DLL adalah 33

Apa langkah berikutnya?

  • Ingin memanggil COM yang berada di komputer lain?  Pelajari Distributed COM (DCOM) lebih lanjut.
  • Tidak ingin memakai teknologi COM melainkan ingin memakai simple DLL?  Lihat solusi yang ditawarkan oleh Winbinder.
  • Walaupun Microsoft tidak menghentikan dukungan atas COM, teknologi tersebut sudah kadaluarsa dan kini digantikan oleh penerusnya.  Ingin beralih ke .NET?  Pelajari lebih lanjut tentang .NET Component.

Tentang Solid Snake
I'm nothing...

9 Responses to Memanggil DLL dari PHP

  1. Hermanto Lim says:

    Nice tutorial, ada source code untuk di download gk? biar bisa langsung praktek 😀

    • Solid Snake says:

      Semua source code yang dibutuhkan telah ada di artikel ini sehingga tidak perlu di-download lagi, yang terdiri atas:
      * source code yang perlu ditambahkan di C++ hanya implementasi fungsi yang akan dipanggil di PHP, tinggal di-copy paste di artikel ini. Source code lainnya akan di-generate secara otomatis oleh Visual C++ dengan bantuan ATL bila mengikuti step-step yang ada dengan benar.
      * source code PHP yang memangil COM DLL.

  2. mantap dosen yang satu ini, tapi tetap masi bingung karena masih asing dengan COM

    hahahaha..

    jadi kalau gw mau ambil COM dari komputer lain, harus belajar DCOM lagi ya?

    • Solid Snake says:

      Coba baca2 lagi buku2 yang membahas COM & sering2 latihan biar ga asing.. DCOM secara sederhananya bisa dibilang COM yang bisa diakses di komputer lain melalui RPC (Remote Procedure Call)…

  3. 1 says:

    DLL nya Pake VB 2008 Bisa Ga Pak Dosen

    • 1 says:

      Sama Contohnya

      • Solid Snake says:

        Sebelum menjawab, saya ingin menegaskan istilah yang saya pakai di artikel. Karena artikel ini bersifat praktis, saya sering mengabaikan teori. Dan ini bagian teori-nya:

        • DLL adalah perwujudan fisik, sebuah penampung (container).
        • COM adalah isi dari di dalam DLL tersebut.

        Jika DLL adalah “tubuh“, maka “jiwa“-nya adalah COM.
        Tetapi “jiwa” raga DLL tidak harus COM.

        • Bisa saja “jiwa” DLL adalah kode program native.
        • Bisa juga “jiwa” DLL adalah .NET Component.
        • Bisa juga “jiwa” DLL adalah teknologi baru yang belum ditemukan dan belum diketahui namanya saat ini.

        Kamu tidak akan bisa melihat dengan jelas “jiwa” ini (tergantung pengalaman kamu), yang kamu lihat adalah fisik “tubuh“-nya yang berupa file DLL.

        Dalam artikel ini, saya membuat DLL dengan standar COM. Kode program PHP disini juga hanya bisa membaca DLL yang memakai standar COM.

        Siapa yang bisa membuat DLL dengan spesifikasi COM? Delphi, C++, Visual Basic, termasuk Visual Basic 6.0 (coba lihat di tampilan New Project di VB 6.0, ada pilihan proyek ActiveX DLL. ActiveX adalah framework untuk COM dan OLE. Sayangnya, saya belum pernah mencoba menghubungkannya dengan PHP semasa masih aktif memakai VB 6). Dan juga bahasa lainnya yang mendukung COM, tergantung pihak marketing Microsoft dalam mempromosikan COM ke pembuat bahasa lain :p

        Pertanyaannya adalah “DLL nya Pake VB 2008 Bisa Ga Pak Dosen“.. Jawabannya adalah bisa dibuat dengan Visual Basic 9 (Visual Basic 2008) karena COM adalah teknologi lama yang digantikan oleh .NET (walaupun demikian, Microsoft tidak menghilangkan dukungan COM karena COM sudah terlanjur banyak dipakai; mustahil bila semua DLL harus migrasi ke .NET dalam waktu beberapa tahun saja, sekarang saja VB 6.0 masih ada yang pakai). Esensi dari proses-nya tidak akan berbeda jauh dengan artikel ini, mungkin tampilannya akan berbeda. Saya tidak dapat menunjukkannya disini karena saya tidak punya rencana untuk downgrade ke Visual Studio 2008. Karena yang diminta adalah Visual Basic 2008, sementara artikel ini memakai Visual C++ 2010, maka caranya berbeda. Link dari MSDN ini menjelaskan cara membuat COM DLL di Visual Basic 2008: http://msdn.microsoft.com/en-us/library/x66s8zcd(v=vs.90).aspx

  4. Ping-balik: COM DLL Akses MySQL – Bagian 3: Operasi Database Insert « The Solid Snake

  5. Ƃuɐdɯɐs Ƃuɐƃƃuıs says:

    cara mengembalikan nilai string gimana ya pak?

Apa komentar Anda?