Share folder dengan Delphi

April 7, 2008 at 1:44 pm | Posted in Applications, Code Samples, Tutorials | 6 Comments
Tags: , , ,

oleh Zamrony P. Juhara

Hari ini ada pertanyaan menarik yang diajukan oleh member milis Delphindo mengenai bagaimana membuat dan menghapus shared folder dengan Delphi. Berhubung saya tidak terlalu sibuk dan belum pernah membuatnya, saya jadi tergelitik untuk melakukannya. Setelah browsing cari informasi sana-sini akhirnya saya tahu cara melakukannya. Dan inilah tutorial singkatnya.

Sekilas NetAPI32.dll

Fungsi-fungsi memanipulasi network dibungkus dalam DLL bernama NetAPI32.dll. Untuk hal-hal terkait sharing resource (folder, printer, communication device dan lain-lain), tersedia fungsi NetShareAdd(), NetShareDel(), NetShareEnum(),NetShareCheck().

Ok kita hanya akan fokus bagaimana membuat shared folder dan menghapusnya. Oleh karena itu saya hanya akan menjelaskan cara penggunaan NetShareAdd() dan NetShareDel().

Membuat Shared Folder

Untuk menjadikan sebuah folder menjadi shared folder, Anda menggunakan NetShareAdd(). AFAIK, Delphi belum menyediakan unit header untuk NetAPI32.dll sehingga Anda perlu membuat unit header dimana deklarasi NetShareAdd() dan NetShareDel() ditempatkan,. Untungnya Anda tidak perlu pusing. Unit bernama netapi32.pas yang saya buat sudah cukup untuk mengkompilasi demo yang akan kita buat.

Deklarasi fungsi NetShareAdd() adalah sebagai berikut:

  function NetShareAdd(ServerName   : PWideChar;
                        Level        : DWORD;
                        buf          : Pointer;
                        parm_err:PDWORD):NET_API_STATUS;
                        stdcall;


Parameter ServerName adalah nama server dimana shared folder akan dibuat. Parameter ini bisa diisi dengan nama komputer atau IP address. Contoh nama komputer saya \\zamrony.

Parameter Level menentukan tipe informasi yang akan dilewatkan ke parameter buf. Bila diisi 2 maka buf diasumsikan bertipe pointer ke struktur data SHARE_INFO_2. Deklarasi record ini adalah seperti listing dibawah ini:

 SHARE_INFO_2   = record
    shi2_netname     :  PWideChar;
    shi2_type        :  DWORD;
    shi2_remark      :  PWideChar;
    shi2_permissions :  DWORD;
    shi2_max_uses    :  DWORD;
    shi2_current_uses:  DWORD;
    shi2_path        :  PWideChar;
    shi2_passwd      :  PWideChar;
  end;

 PSHARE_INFO_2  = ^SHARE_INFO_2;


Jika Level diisi 502, buf diasumsikan berisi pointer ke record SHARE_INFO_502 yang deklarasinya adalah sebagai berikut:

 SHARE_INFO_502   = record
    shi502_netname     :  PWideChar;
    shi502_type        :  DWORD;
    shi502_remark      :  PWideChar;
    shi502_permissions :  DWORD;
    shi502_max_uses    :  DWORD;
    shi502_current_uses:  DWORD;
    shi502_path        :  PWideChar;
    shi502_passwd      :  PWideChar;
    shi502_reserved    :  DWORD;
    shi502_security_descriptor:PSecurityDescriptor;
  end;

  PSHARE_INFO_502  = ^SHARE_INFO_502;


Apa bedanya? SHARE_INFO_502 berisi informasi lebih advance terutama dengan adanya security descriptor yang utamanya digunakan pada sistem NT. Saya menggunakan XP, dan SHARE_INFO_2 sudah cukup bagi saya.

Parameter terakhir adalah parm_err, akan diisi dengan status kesalahan. Saya tidak butuh jadi cukup saya isi dengan nil.

Ok mari kita bicarakan field-field pada SHARE_INFO_2.

Field pertama shi2_netname harus diisi dengan nama shared folder tersebut. Contoh jika kita ingin sebuah folder diakses lewat network dengan alamat \\zamrony\data_penting. Maka shi_netname diisi dengan data_penting.

Field kedua shi2_type diisi dengan tipe resource yang akan di-share. Untuk folder, Anda menggunakan STYPE_DISKTREE. Potongan kode berikut ini berisi daftar tipe-tipe resource.

const
  STYPE_DISKTREE =0;
  STYPE_PRINTQ   =1;
  STYPE_DEVICE   =2;
  STYPE_IPC      =3;


Field shi3_remark diisi dengan deksripsi singkat folder yang di-share. Deskripsi ini akan ditampilkan ketika kursor mouse berada di atas shared folder.

Field berikutnya adalah shi2_permissions. Field ini harus diisi dengan level akses yang diinginkan apakah read-only, read-write atau lainnya. Kode berikut berisi daftar akses yang dapat diberikan ke shared folder.

  ACCESS_READ   =$01;
  ACCESS_WRITE  =$02;
  ACCESS_CREATE =$04;
  ACCESS_EXEC   =$08;
  ACCESS_DELETE =$10;
  ACCESS_ATRIB  =$20;
  ACCESS_PERM   =$40;

  ACCESS_GROUP =$8000;

  ACCESS_NONE =0;
  ACCESS_ALL  =(ACCESS_READ or
                ACCESS_WRITE or
                ACCESS_CREATE or
                ACCESS_EXEC or
                ACCESS_DELETE or
                ACCESS_ATRIB or
                ACCESS_PERM);


Field shi2_max_uses diisi dengan jumlah koneksi maksimum yang diijinkan.
Field shi2_current_uses diisi dengan jumlah koneksi saat ini.

Field shi2_path diisi dengan nama folder yang akan di-share. Contoh c:\\Downloads\data_penting.

Field terakhir adalah shi2_passwd berisi password yang digunakan untuk mengakses folder tersebut lewat network. Jika tidak ingin menggunakan password, isi dengan nil.

Contoh kode berikut ini akan menciptakan shared folder berdasarkan input user.

procedure TForm1.btnAddShareClick(Sender: TObject);
var shareInfo:SHARE_INFO_2;
    servername,netname,path,pass:widestring;
    status:NET_API_STATUS;
begin
  netname:=edShareName.Text;
  servername:=edServerName.Text;
  path:=edPath.Text;
  pass:=edPassword.Text;

  zeroMemory(@shareInfo,sizeof(SHARE_INFO_2));
  //set nama sharing
  shareInfo.shi2_netname:=PWideChar(netname);
  //share folder
  shareInfo.shi2_type:=STYPE_DISKTREE;
  //keterangan folder yg disharing
  shareInfo.shi2_remark:=PWideChar('sharing folder '+netname);

  //atur permisssion
  if chkbxAccessRead.Checked then
shareInfo.shi2_permissions:=shareInfo.shi2_permissions or
                                ACCESS_READ;
  if chkbxAccessWrite.Checked then
    shareInfo.shi2_permissions:=shareInfo.shi2_permissions or
                                ACCESS_WRITE;
  if chkbxAccessExec.Checked then
    shareInfo.shi2_permissions:=shareInfo.shi2_permissions or
                              ACCESS_EXEC;
  if chkbxAccessCreate.Checked then
    shareInfo.shi2_permissions:=shareInfo.shi2_permissions or
                             ACCESS_CREATE;
  if chkbxAccessDelete.Checked then
    shareInfo.shi2_permissions:=shareInfo.shi2_permissions or
                             ACCESS_DELETE;
  if chkbxAccessAttrib.Checked then
    shareInfo.shi2_permissions:=shareInfo.shi2_permissions or
                             ACCESS_ATRIB;
  if chkbxAccessPerm.Checked then
    shareInfo.shi2_permissions:=shareInfo.shi2_permissions or
                             ACCESS_PERM;
  if chkbxAccessAll.Checked then
    shareInfo.shi2_permissions:=shareInfo.shi2_permissions or
                            ACCESS_ALL;


  shareInfo.shi2_max_uses:=strtoint(edMaxUser.Text);
  shareInfo.shi2_current_uses:=0;
  shareInfo.shi2_path:=PWideChar(path);
  //tanpa password
  shareInfo.shi2_passwd:=PWideChar(pass);

  status:=NetShareAdd(PWideChar(servername),2,@shareInfo,nil);
  if status<>NERR_SUCCESS then
    raise Exception.Create('Gagal membuat share');

end;


Pada contoh di atas status bertipe NET_API_STATUS. Tipe ini pada dasarnya adalah tipe DWORD. Ada beberapa bagian dikode tersebut dimana saya mengkopi data dari string ke widestring. Konversi dari Ansi string ke Unicode akan dikerjakan otomatis. Ini untuk memastikan bahwa string yang di-typecast ke PWideChar berisi pointer ke string Unicode.

Menghapus Shared Folder

Untuk menghapus shared folder. Caranya lebih simple. Anda hanya membutuhkan nama server dimana shared folder tersebut berada dan nama sharingnya. Berikut ini adalah deklarasi NetShareDel() yang berfungsi menghapus shared folder.

  function NetShareDel(ServerName: PWideChar;
                       NetName  : PWideChar;
                        Reserved : DWORD):NET_API_STATUS;
                        stdcall;


Contoh untuk menghapus shared folder yang datanya diinputkan oleh user.

procedure TForm1.btnDeleteShareClick(Sender: TObject);
var servername,netname:widestring;
    status:NET_API_STATUS;
begin
  netname:=edShareName.Text;
  servername:=edServerName.Text;

  status:=NetShareDel(PWideChar(servername),
                      PWideChar(netName),0);
  if status<>NERR_SUCCESS then
    raise Exception.Create('Gagal menghapus share');

end;


Penutup

Ok cukup sederhana kan? Untuk source code demo lengkap bagaimana menciptakan shared folder di Delphi, silakan download di sini. Demo ditulis dengan kompiler Turbo Delphi Explorer 2006.

6 Comments »

RSS feed for comments on this post. TrackBack URI

  1. article yang bagus, keep it flow bro ….

  2. Pak Zamrony, saya sudah coba code dari bapak, tapi setelah itu saya mencoba buka share folder yang telah dibuat, dari komputer lain ternyata muncul “Folder is not accessible. You might not have permission to use this network resource. Contact the administrator of this server to find out you have access permissions”. Itu kenapa ya pak?
    tks,.

  3. fungsi dari Resource sharing

  4. pak,,mau tanya..
    klo ngebuka share folder,,tp kan ada hak aksesnya..
    nah cara nanem username n password di delphi nya gimana yah??

    mohon pencerahannya..makasih pak..^_^..

  5. pak clo misalnya saya ingin mengirim file ke komputer lain melalui jaringan LAN gmana caranya?

  6. pak Zamrony, untuk source code demo lengkap sudah tidak valid. bisa diinfo supaya saya bisa download. terima kasih šŸ™‚


Leave a reply to tyo Cancel reply

Blog at WordPress.com.
Entries and comments feeds.