Showing posts with label Kode. Show all posts
Showing posts with label Kode. Show all posts

1.8.08

Better Memory Management With Vista

Today, i just found out that Vista handles segfault much better than XP. I have reproduced the problem as you can see at the picture below.

 

nasty_small

 

While XP insanely kept ignoring this until it finally went to a boom boom (i can tell you it was horrible!), Vista treated it much better.

You see at the picture above, Vista just "localized" the problem.

I'm gonna find out more about this. But right now, all i can think of is how process in XP could easily pollute user space.

Incremental Link

I saw someone at dotnet forum asking for a help on building a very simple application.

He said that when he built the project, he encountered an error on something that has to be related with msvcr90d.dll.

And then the story continues to Incremental Link...

 

I think it's better for me to explain a bit about incremental link (/INCREMENTAL).

This option has nothing to do with the run-time library. It's just a smart mechanism to aid us as a programmer.

Before that it's also important to know the "flow" in order to produce the EXE. Basically there're 2 steps, compiling and linking.

When you compile a source file (C source file for example), you're going to generate an object file. That object file(s) will be linked together, and voila.. you have your EXE.

You see, compile -> link -> exe.

Imagine you have a huge project (ballistic missile control project) that contains hundreds (or maybe thousand) of source file. When you change 1 source file you have to build the whole project. Compiling and then linking those hundreds object files. What this means?

Total waste of time.

 

And this is how incremental link works. You don't have to build the whole project, and waste your precious time.

When you activate this option, you'll see an ilk file. I would say this is a database which contains information about your project. For example timestamps of every object file you generated before. So when you change one file, and you generate object file, that (only) changed object file will be "patched" to a previously exe.

 

Let's experiment this, and compare the time needed to build the project. See the difference?

But, yes there's a but :)

1. Your application will be fatter (in my case 1.78 MB vs 1.43 MB)

2. May contain jump thunks*

 

Also, there's an important note from the MSDN:

To ensure that your final release build does not contain padding or thunks, link your program nonincrementally.

 

If you want to know more about code and data padding or thunks, check this website:

http://msdn.microsoft.com/en-us/library/4khtbfyf(VS.80).aspx

or this:

http://docs.sun.com/source/806-3567/ild.html

 

Back to the problem with our very simple application problem. I would say the problem is in the run-time library. He needs to make sure which library he wants to link. When he said there's an error with msvcr90d.dll. He must have linked the application with msvcrtd.lib. And this is the multithreaded and dynamic link (debug) version.

Make sure this with project's settings.

1.  C/C++ -> Code Generation -> Runtime Library

2. Linker -> Input

21.7.08

Win32 Programming Training

Hari sabtu kemarin, saya bawakan materi Basic of Win32 Programming (part of C++/Win32 at MIC University of Indonesia event)
Materinya sendiri masih seputar how Windows application works, how Windows interacts with our application, etc

Untuk beberapa orang, programming dengan mengakses langsung Win32 API dengan language seperti C akan sangat mengerikan. Ambil contoh saja untuk menampilkan Hello World's window dibutuhkan sampai lebih dari 50 baris kode!
Untuk apa menyusahkan diri?
Jawaban.

Semoga tidak membuat patah semangat para peserta training ini. Semoga :)

9.7.08

Setelah Sekian Lama "Idle"

Memang 2 bulan ini campur aduk aktifitas. Banyak waktu habis di jalan juga.
Tapi senang juga, karena berada dalam tempo yang tinggi.
Persiapan menuju "big day" lumayan juga. Mungkin tinggal beberapa hal - hal kecil.
Yang terpenting malah persiapan mental.
Kadang aneh juga lihat orang yang seluruh perhatiannya ditumpahkan "hanya" untuk 1 hari itu. Sepenting itukah 1 hari itu? (Ya, memang orang bisa ber-argumentasi itu khan once in a lifetime)
Bahkan semua yang kita lakukan prinsipnya "once in a lifetime". Consider this.
Makanya saya mau menjalani hidup saya seperti besok saya akan mati.
Ya, sesuai banget dengan kata - kata manis dari papan kayu nisan di rawaseneng.
Me today, you tomorrow. (Saya benar - benar mengagumi kedalaman kata - kata ini)

Anyway, saya coba manfaatkan waktu saya yang campur aduk tadi untuk membuat software baru. (Masih berurusan dengan SMS, lha wong saya cuma ngerti ini :) )
Tantangan terbesar bagi saya untuk membuat software ini adalah masalah kompatibilitas dengan Vista. Contoh kecil: fungsi fopen vs fopen_s, masalah UNICODE, dst..

Semoga sebelum "big day" itu, saya sempat release software ini.
Semoga.

Win32 (Works with Windows Vista)

11.3.08

Pencapaian Hari Ini

Hari ini selesai juga proses prototyping untuk produk baru.
Ada beberapa hal yang menjadi perhatian di bagian akhir proses prototyping ini.
Dan yang paling utama adalah, harus berinterfacing lagi dengan OLE.
Ya sebenarnya ndak terlalu masalah juga, cuma tambah sedikit gembrot saja kode programnya.
Karena bahasa pemrograman yang digunakan C, seluruh method yang diakses (ugh, i hate that OO thingy!) harus mengakses VTable. Contoh:

hr = m_lpAdrBook->lpVtbl->GetPAB(m_lpAdrBook, &lpcbEID, &lpEID);

Bagian yang mana, yang sedikit membuat gembrot? Itu tuh..
Pada C, "object" yang mengakses method (pada contoh di atas: GetPAB) harus dilewatkan secara manual. Berbeda dengan C++ yang melakukan hal ini secara otomatis.

Ah, tapi ini yang bikin tambah cinta dengan C . Ku tahu yang ku mau, dan ku tahu apa yang ku lakukan itu kemauan ku itu :)

Oh ya, selain menyelesaikan prototyping.. malam ini saya beli buku karangan Bentley & Whitten lagi. Semoga buku yang ini sama bagusnya dengan buku - buku karya Bentley & Whitten lainnya (contoh: System Analysis & Design Method)
Ada 2 buku lain lagi yang harusnya malam ini dibeli, tapi karena sudah kemaleman..
Yo wis.. besok lagi..

25.2.08

Perbaikan Pada MySQL

Setelah sekian lama saya "meninggalkan" MySQL. Beberapa hari belakangan ini saya coba versi terbaru MySQL.
Ada beberapa hal yang telah diperbaiki:
  1. Panjang maksimum query yang dapat diterima pada mysql client sudah tidak dibatasi lagi.
  2. Kasus data (lebih tepatnya table form) yang corrupt pada saat data dishare antara MySQL server dan embedded sudah tidak ada.
  3. Interrupt signal sekarang sudah benar - benar mematikan thread, bukan sekedar mematikan mysql client namun thread masih berjalan.
3 hal ini sangat membantu :)

18.2.08

4 Hari vs 5 Menit

Setelah 4 hari mencoba men-subclass kan edit control, hari ini saya malah menghasilkan solusi dengan pendekatan lain. Cukup 5 menit untuk ini.
Ada kalanya imaginasi + trik lebih ampuh daripada pendekatan teknis :)

28.12.07

Gammu - Nokia 1600

Malam ini sepertinya upaya untuk "porting" gammu ke Nokia 1600 harus distop terlebih dahulu.
Waktu yang terbuang sudah terlalu banyak, dan hasilnya minim.
Yang benar - benar menyedihkan dari gammu ini adalah kurangnya dokumentasi, satu - satunya yang bisa diandalkan cuma dokumentasi singkat API.
Struktur dari kode programnya juga cukup mengagumkan.. 1 source file bisa sampai 2500 baris (contoh: 6510file.c)

Anyway, status terakhir untuk Nokia 1600 adalah:
Information, Phonebook, Call

7.8.07

Win32 Hello World

Saya paste-kan "beberapa" baris kode di bawah ini.
Kesan pertama yang timbul saat melihat barisan kode ini mungkin mengerikan!
Hanya untuk menampilkan window yang sedemikian sederhananya harus mengetikan sedemikian banyak baris kode?
Jawabannya ya dan tidak.
  • Ya, baris kode di bawah adalah minimal
  • Tidak harus diketik. Saya belom pernah bertemu dengan programmer Windows yang secara "manual" mengetikan baris kode di bawah. Kebiasaannya adalah baris kode tersebut di simpan dalam suatu file dan kemudian dikopi-pastekan saat dibutuhkan :)
Dibandingkan program yang berbasis windows, program DOS hanya membutuhkan ± 5 baris kode untuk ber-"Hello, World" ria. (saya berbicara tentang pemrograman standar, dan bukan pemrograman "hard-core" yang diikutsertakan dalam kontest Obfuscated code.


#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("HelloWinWorld") ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;

     /* definisi window class */
     wndclass.style         = CS_HREDRAW | CS_VREDRAW;
     /* opsi redraw */
     wndclass.lpfnWndProc   = WndProc;
     /* window function */
     wndclass.cbClsExtra    = 0;
     /* bytes extra untuk class struct */
     wndclass.cbWndExtra    = 0;
     /* bytes extra untuk window struct */
     wndclass.hInstance     = hInstance ;
     /* window instance */
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
     /* icon program */
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW);
     /* cursor program */
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
     /* warna backgroud */
     wndclass.lpszMenuName  = NULL;
     /* window menu   */
     wndclass.lpszClassName = szAppName;
     /* nama class    */

   /* daftarkan window class yang telah kita definisikan di atas */
     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"),  szAppName, MB_ICONERROR) ;
          return 0 ;
     }
  
   /* buat window dengan nama class yang telah didaftarkan di atas */
     hwnd = CreateWindow (szAppName, /* nama class window      */
TEXT ("The Hello World Program"), /* judul window   */
WS_OVERLAPPEDWINDOW, /* style window    */
CW_USEDEFAULT, /* posisi x window   */
CW_USEDEFAULT, /* posisi y window  */
CW_USEDEFAULT, /* lebar window   */
CW_USEDEFAULT, /* tinggi window   */
NULL, /* handle parent window */
NULL, /* menu window   */
hInstance, /* window instance  */
NULL); /* parameter tambahan  */

   /* tampilkan window yang telah dibuat */
     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;

   /* proses Windows message */
     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}

/* window procedure yang akan memproses setiap message yang diterima */
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     switch (message)
     {
   /* contoh message yang diterima dari Windows adalah WM_DESTROY, yaitu windowakan di-"hancurkan", berdasarkan perintah yang diterima dari pengguna program, biasanya pengguna meng-klik tombol close */

     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}


Saya tidak membahas lebih lanjut, silahkan diamati saja kode program di atas, dan mulai modifikasi.

2.8.07

Fundamental Pemrograman Windows

Saya tertarik untuk membahas sedikit (atau mungkin banyak?) tentang pemrograman Windows dengan langsung mengakses API yang tersedia.

Sekilas tentang pemrograman Windows, terlepas dari apa bahasa pemrograman yang digunakan dan dengan cara apa. Ada 2 cara untuk membuat program tersebut.
1.  Mengakses langsung API yang tersedia
2. Menggunakan class library yang mengenkapsulasi API

Banyak perdebatan tentang mana yang lebih baik dari 2 cara / metode di atas.
Saya akan coba sedikit mengulas secara obyektif tentang pro dan kontranya.
1. Mengakses langsung API
Pro:
  • Memberikan kita pengertian yang mendalam tentang apa yang kita bangun (banyak kejadian dimana programmer tidak tahu kenapa kok ini bisa begini atau itu bisa begitu, yang penting apa yang saya inginkan bisa jalan/jadi)
Kontra:
  • Banyak orang berpendapat bahwa mengakses langsung API sangat tidak praktis (kenapa harus repot kalau kita bisa menggunakan class library yang telah tersedia)
2. Menggunakan class library yang mengenkapsulasi API
Pro:
  • Memudahkan pemrograman (tidak perlu membuat "tangan kita kotor" dengan detail - detail pemrograman)
  • Otomatis membuat development time menjadi berkurang
Kontra:
  • Kurangnya pemahaman (yang mendetail) tentang apa yang terjadi di dalam suatu proses pembangunan software maupun produk jadinya.

Saya tidak akan membahas terlalu jauh tentang hal ini, silahkan googling untuk informasi lebih detail.
Untuk sharing (saya suka kata ini :) ) saya kali ini, saya fokus dengan cara / metode #1.

Perlu juga saya bahas sedikit tentang dasar pemrograman di lingkungan Windows.
Sebelumnya saya hendak bertanya bagaimana software/program yang kita bangun berinteraksi dengan Windows? Bagaimana caranya Windows atau program kita, menterjemahkan, katakanlah setiap klik pada mouse ? Bagaimana proses sebenarnya dari program stock & inventory yang kita bangun, yang memungkinkan kita untuk menekan tombol tertentu dan data barang bisa ditampilkan pada kontrol tertentu (contoh: Listview) ?
Apakah ada suatu proses yang terjadi di balik proses klik pada mouse atau penekanan tombol? atau memang terjadi begitu saja? :) 

Proses sebenarnya yang terjadi adalah komunikasi antara program yang kita bangun (dan tentu saja sedang kita jalankan) dengan Windows.
Windows yang memulai proses komunikasi, Windows akan mengirimkan message/pesan ke setiap event yang terjadi kepada program yang sedang kita jalankan. Setelah menerima pesan tersebut, program akan menterjemahkan message/pesan tersebut dan kemudian memberikan respon. Setelah merespon Windows, program akan kembali menunggu untuk message/pesan berikutnya dari Windows.

Seperti pada contoh di atas dimana pengguna program stock & inventory menekan tombol tertentu untuk menampilkan data barang. Windows mendeteksi ada suatu peristiwa dimana suatu tombol pada suatu program sedang ditekan, kemudian Windows langsung mengirimkan message/pesan kepada program yang bersangkutan, dalam hal ini message yang diberikan adalah WM_COMMAND (akan kita bahas kemudian).
Program menerima message/pesan, menterjemahkan message/pesan tersebut, lalu memberikan respon, yaitu menampilkan data barang.

Setelah kita mengetahui bagaimana Windows dan program yang sedang kita jalankan berinteraksi, kita akan masuk sedikit lebih dalam lagi.

Bagi yang memiliki pengalaman atau pernah membuat program dengan bahasa pemrograman C,C++,D pasti sudah tidak asing lagi dengan fungsi main(), dimana seluruh proses akan dimulai dari fungsi ini. 
Sama dengan konsep ini, seluruh program Windows dimulai dari fungsi ini, namun dengan nama yang sedikit berbeda, yaitu WinMain().
Fungsi WinMain() memiliki perbedaan dibanding fungsi - fungsi lain. WinMain menggunakan WINAPI sebagai calling convention.
Nilai kembalian dari WinMain() harus bertipe int.

Kita lanjut ke fungsi berikutnya. Setiap program Windows harus memiliki fungsi yang dikhususkan untuk Windows, melalui fungsi inilah seluruh proses komunikasi antara Windows dan program yang kita buat terjadi. Fungsi ini biasanya dipanggil sebagai window procedure.
Message/pesan dari Windows (seperti yg kita bahas di atas) diterjemahkan dan diolah di fungsi ini. Seluruh window procedure harus mengembalikan nilai dengan tipe LRESULT CALLBACK. LRESULT sendiri adalah 32-bit int, sedangkan CALLBACK calling convention
digunakan oleh seluruh fungsi yang dipanggil/dikirimkan pesan oleh Windows.

Setelah kita mengetahui bahwa seluruh program Windows dimulai dari fungsi yang bernama WinMain() dan kemudian window berkomunikasi dengan program melalui window procedure. Berikutnya adalah window class.
Mungkin mendengar kata class di sini, kita langsung terpikir dengan class yang ada dalam bahasa pemrograman yang berorientasi object seperti C++. Apakah class yang ini yang dimaksud?
Tidak. Window class di sini lebih dimaksudkan dengan style atau tipe. Lalu apa itu style atau tipe ini?
Katakanlah kita mau membuat sebuah window seperti pada gambar di bawah. 
Kita tentukan warna backgroundnya putih, window icon nya adalah icon standard aplikasi, dst.



Setelah window class, selanjutnya adalah message loop
Seperti sudah dibahas di atas bahwa Windows dan program yang kita jalankan berkomunikasi melalui message/pesan, dan bahwa Windows akan mengirimkan message/pesan kepada program untuk setiap event yang terjadi. Setelah menerima message/pesan dari Windows dan meterjemahkan/mengolahnya maka program akan berada dalam posisi menunggu kembali.
Message loop terdapat didalam fungsi WinMain().

OK, cukup teorinya. Saya akan lanjutkan dengan praktek.