Last Modify : July 24, 2007 11:00
¼ö ¸¹Àº °í¼ö ºÐµéÀº ÀÌ¹Ì ¾Ë°í °è½ÇÅ×Áö¸¸, À̰÷À» ¾Æ¹«¸®~~~µÚÁ®ºÁµµ ÀÚ·á°¡ ¾ø¾î¼ (Á¦ °æ¿ì¿¡ ¸»ÀÌÁÒ) ÀÌ·¸°Ô
Àú¿Í °°Àº ÃÊÂ¥ºÐµé °í»ýÇϽDZîºÁ Á¤º¸ °øÀ¯ÇÕ´Ï´ç.
ÁÖÁ¦´Â ½Ã¸®¾ó ³Ñ¹ö üũÇϱⱸ¿ä. VC++6.0°ú ÀνºÅç ½¯µå 9.0ȯ°æ¿¡¼ ½ÇÇàÇÕ´Ï´Ù.
Á¦ °æ¿ì ¼ø¼´Â ´ÙÀ½°ú °°ÀÌ Çß½À´Ï´Ù.
[1´Ü°è - ÀνºÅ罯µå¿¡ ½Ã¸®¾ó ³Ñ¹ö üũÇÒ ºÎºÐÀ» À§ÇÑ È¯°æ ¸¸µé±â]
0. ¼³Ä¡ÇÒ ÇÁ·Î±×·¥À» ¸¸µé°í¼ À̰ÍÀ» ¸±¸®Áî ¹öÁ¯À¸·Î ÄÄÆÄÀÏ Çß½À´Ï´Ù.(Ctrl+F5Ű)
1. ÀνºÅç ½¯µå¸¦ ÄÕ´Ï´Ù.
2. InstallScript MSI Project·Î ÇÁ·ÎÁ§Æ®¸¦ Çϳª »ý¼ºÇÕ´Ï´Ù.
3. ÇÁ·Î±×·¥ À̸§À» Á¤ÇÏ°í ±âŸµîµî ´Ù ¼³Á¤ÇÏ°í¼ ¼³Ä¡ÇÒ ½ÇÇàÆÄÀÏ ¹× ÄÄÆ÷³ÍÆ®¸¦ µî·ÏÇØ¾ß °ÚÁÒ?
ÀÌ°Å¾ß ¸Ó½Ã±â À§ÀÚµå ÀÌ¿ëÇϸé ÀÏ»çõ¸®·Î ÁøÇàµÇÁö¿ä. (¿©±â±îÁö´Â ´©±¸³ª ¾Æ´Â°Å´Ï±ñ¿ä. ´ëÃæ ³Ñ¾î°¡±¸¿ä.)
[2´Ü°è - ½Ã¸®¾ó ³Ñ¹ö¸¦ üũÇÒ DLLÆÄÀÏ ¸¸µé±â]
Àú´Â Á¦ÀÏ ¹«³ÇÏ°Ô VC++ 6.0 MFC ·Î ¸¸µé¾ú½À´Ï´Ù. ¿©±â¼ ÁÖÀÇÇÒ °ÍÀº Á¤ÀûDLL·Î ¸¸µé¾î¾ß ÇÑ´Ù´Â °Ì´Ï´Ù.
¾È±×·Á¸é VC++°¡ ¾ø´Â °÷¿¡¼´Â ¾Æ¸¶ 0x80040702 Dll Load Failure ¸Þ¼¼Áö°¡ ¶ß¸é¼ ¼³Ä¡ Áß°£¿¡ ¸ØÃç¹ö¸±²¨¿¡¿ê.
Á¦°¡ À̰Ͷ«¿¡ °ÅÀÇ ¿©´ü½Ã°£À» °í»ýÇßÁö¿ä. ÀÌ°É ¸ô¶ó¼¸®.¤»
µ¿ÀûDLL·Î ¸¸µé°í´Â ÀÌ·± »ý°¢À» ÇÏ½Ç ¼ö Àִµ¥¿ä. "VC++ÀÇ depends(Dependency WalkerÁÒ)·Î ½Ã¸®¾ó
üũÇÏ´Â dll¿¡ ¿¬°üµÇ´Â ¸ðµç Dll ±Ü¾î ¸ðÀº ´ÙÀ½¿¡ ÀνºÅ罯µåÀÇ ¿ÞÂÊâ¿¡ Behavior and Logic¿¡¼
Support Files / BillBoardÀÇ Language Independent(ÀÌ°Ç ¿À¸¥ÂÊâ)¿¡ ´Ù°¡ ÆÄÀÏ ´Ù ¶¯°Ü¿À¸é µÇÁö ¾Ê´©?
±×¸®°í ¿ÞÂÊâÀÇ Additional Tools¿¡¼ Dependency scanner·Î Á¤Àû/µ¿Àû ÀÇÁ¸ÆÄÀÏ ºÒ·¯¸ðÀ¸¸é µÇÁö ¾Ê´©?"
¶ó±¸¿ä...Á¦°¡ ½Ç·ÂÀÌ ¾ÈµÇ¼¸® ´Ù ÇØºÃ´Âµ¥ ¼Ò¿ë ¾ø´õ±º¿©. ¸Ó...
"³ ÇÒ ¼ö ÀÖ´Ù³×~~"¶ó°í ÇϽøé¾ß ÇÒ ¸»ÀÌ ¾øÁö¸¸¿ä.¤»
¾î·µç ÀÌ·¸°Ô dll ÆÄÀÏÀ» ¸¸µì´Ï´Ù. ¸¸µå´Â °úÁ¤Àº ÀÌ·¸½À´Ï´Ù.(Áö±ÝºÎÅÏ VC++¿¡¿ë.)
0. »õ ÇÁ·ÎÁ§Æ®¸¦ Çϳª ¸¸µì´Ï´Ù.¹°·Ð MFC AppWizard(dll)·Î Çϼž߰ÚÁÒ.
1. À̶§ AppWizardÀÇ Step 1 of 1¿¡¼ Á¦ÀÏ ÀºÎºÐÀÇ Regular Dll with MFC statically linked¸¦ ¼±ÅÃÇÕ´Ï´Ù. µý°Ç ³ÀµÖ¿ë.
±×·³ ÇÁ·ÎÁ§Æ®°¡ Çϳª »ý¼º µÇ°ÚÁÒ? ÀÌ°É Ctrl+F5·Î ¸±¸®Áî ÄÄÆÄÀϸµÀ» Çϸé ÀÎÁ¦ ¾Æ¹«¶§³ª ¾µ ¼ö ÀÖ´Â dllÀÌ µÇÁö¿ä.
ÀÌÁ¦ DllÀÇ ³»¿ëÀ» º¼±î¿ä? ÇÁ·ÎÁ§Æ® À̸§À» [SerialManSe]¶ó°í ÇÏÁÒ. ½Ã¸®¾ó¸¸¼¼ÀÔ´Ï´Ù.¤¾¤¾
2. Çì´õÆÄÀÏÀ» º¸ÁÒ. variables declarationÀ» ÇØ¾ß°ÚÁÒ? ¿¹. º¯¼ö ¼±¾ð¿ä.
protected¿Í
public privateÀ» ÀûÀýÈ÷ ½á¼
½Ã¸®¾ó °è»ê¿¡ ÇÊ¿äÇÑ °¢Á¾ º¯¼ö¸¦ ¸¸µì´Ï´Ù. ÀÌ°Ç ÀÚÀ¯¿¡¿ë. ´Ù¸¸ Á¦´ë·Î µ¹¾Æ°¡°Ô ¸¸µå½Ã±æ.¤»
3. ´ÙÀ½ Çì´õ¿¡¼ Ŭ·¡½º ¼±¾ðºÎ°¡ ³¡³ª°í ¹Ù·Î ¹ØºÎºÐ¿¡´Ù°¡ ÀÌ·¸°Ô ¶±ÇÏ´Ï ½áÁÝ´Ï´Ù.
extern "C" __declspec(dllexport)
int CheckSerial(
char* charSerialNumber);
// ÀÌ dllÆÄÀϸ¸ ÀÖ´Ù¸é üũÇÒ ¼ö ÀÖ´Ù. ¾Æ½Î~~~ÇÊ¿äÇÏ¸é °®´Ù ¾²3.
¹°·Ð ¸Ó...CheckSerial¸¸ÀÌ ¾Æ´Ï¶ó SerialCheckµµ µÇ±¸¿ä. ¸Ó...¿øÇÑ´Ù¸é SerialManSe(½Ã¸®¾ó¸¸¼¼)µµ µÇ±¸...ÀÚÀ´´Ï´Ù.¤»
Áß¿äÇÑ°Ç cdecl°ú stdcallÀÌ ¾ø´Ù´Â °ÅÁÒ. °£È¤ ¾²½Ã´Â ºÐÀÌ °è½Åµ¥, ¸Ó À̰ɾ²¸é ¾îÂîµÉÁö´Â ¾È½áºÁ¼ Àß ¸ð¸£°Ú½À´Ï´Ù.¤¾¤¾
¿©±â¼ ÇѰ¡Áö ´õ~!! Alt+F7´·¯¼¿ä(Project SettingÀÌÁÒ), c/c++¿¡¼¿ä. category¸¦ generalÀÌ ¾Æ´Ï¶ó code generationÀ¸·Î
º¸¼¼¿ä. ±×·³ calling convention¶õÀ» º¸¸é cdeclÀ̶ó°í µÇÀÖ½À´Ï´Ù. ¾î¶²ºÐÀÌ ÀÌ°É È®ÀÎÇ϶ó´Âµ¥, ¹º¸»ÀÎÁö´Â Àß ¸ð¸£°Ú½À´Ï´Ù.
¾î·µç óÀ½¿¡ ÇÁ·ÎÁ§Æ® »ý¼ºÇÏ°í ¾È°Çµå·È´Âµ¥, Àü cdeclÀ̶ó°í µÇÀÖ¾î¼ ±×³É ³Ñ¾î°¬Áö¿ä.
4. ÀÎÁ¦ ´ë¸ÁÀÇ ±¸ÇöºÎºÐÀÔ´Ï´Ù.¤» À̰Š...¸Ó ÀÚÀ¯ÁÒ. ´ÙÀ½°ú °°ÀÌ ÇÔ¼ö¸íÀ» ½áÁÖ°í ±× ´ÙÀ½ºÎÅÏ ÀÚÀ´´Ï´Ù.(ÀÚÀ¯...Âü ÁÁÁÒ.)
¾ÆÁÖ¾ÆÁÖ¾ÆÁÖ¾ÆÁÖ¾ÆÁÖ °£´ÜÇÏ°Ô ÇÔ¼ö¸¦ ±¸ÇöÇÏ¸é ´ÙÀ½°ú °°ÀÌ ÇÕ´Ï´Ù. ÇÊ¿äÇÏ¸é °®´Ù ¾²¼¼¿ä.
CSerialManSeApp theApp;  
//½Ã¸®¾ó¸¸¼¼ ÇÁ·ÎÁ§Æ® AppÀνºÅϽºÁÒ. ¾Æ·¡ ÇÔ¼ö°¡ Ŭ·¡½º ¸Þ¼Òµå°¡ ¾Æ´Ñ°ü°è·Î ²À ¼±¾ðÇØÁà¾ß ÇÕ´Ï´Ù.
 
//char* charSerialNumber ¿©±â ÀÌ ÆÄ¶ó¹ÌÅÍ·Î ½Ã¸®¾óÀÌ ³¯¶ó¿ÀÁÒ. °£È¤ ÄÄÅͰ¡ ´À¸®¸é ±â¾î¿Ã ¼öµµ ÀÖÀ¸´Ï Á¶½ÉÇϼ¼¿ê.^^
extern "C" __declspec(dllexport)
int SerialManSe_CheckCheckCheck(
char* charSerialNumber)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
 
// ½Ã¸®¾ó ¹øÈ£¸¦ ÀúÀåÇÒ ºÎºÐ
CString serialString;
 
// ½Ã¸®¾óÀ» char¿¡¼ ½ºÆ®¸µÀ¸·Î º¯È¯ÇÕ´Ï´Ù.
serialString.Format(
"%s", charSerialNumber);
 
// ÀÌ°Ô ¸Ó¾ß?ÇÏ°í ¹°À½Ç¥°¡ ¸Ó¸´¼Ó¿¡ ±×·ÁÁö´Â ºÐµéÀº ¾Æ·¡ ÁÖ¼®À» º¸¼¼¿ä.
theApp.SetSerial(atol((LPSTR)(LPCTSTR)serialString));
 
// theApp. -> Ŭ·¡½º ÀνºÅϽºÁÒ.À̰оøÀ¸¸é ¾ÈµÇ¿ä. ¸Ó °£È¤ '³ª ÇÊ¿ä ¾ö¶°~'ÇÏ´Â ºÐµéÀÌ °è½ÃÁÒ.¤»
 
// SetSerial(); -> ÀÌ°Ç ¿©±â °ø°³ ¾ÈÇߴµ¥, Ŭ·¡½ºÀÇ protectedº¯ ¼öÀÎ CString serial¿¡ ÀúÀåÇÏ´Â AccessorÇÔ¼öÀÔ´Ï´Ù.
 
// ´ÙÀ½ SetSerial¿¡ ÆÄ¶ó¹ÌÅÍ·Î Àü´ÞµÇ´Â atol() -> ±ÛÀÚ·Î ÀÔ·ÂµÈ °ÍÀ» ¼ýÀÚ·Î ¹Ù²ãÁÖ´Â ÇÔ¼ü´Ï´Ù.
 
// (LPSTR)(LPCTSTR)serialString -> ¤¾¤¾¸ô¶óµµ µÇÁÒ.¤» ¾Ë°í½ÍÀ¸½Ã¸é empas ¸ð¿©¶ó °Ë»ö¿¡¼ °Ë»öÇØº¸¼¼¿ä.¤¾¤¾
 
// IsThatRight ->½Ã¸®¾óÀÌ ¸Â´Ï? ÇÏ°í ¹°¾îº¸´Â ÇÔ¼öÁÒ. ÀÌ dllÀÇ ½ÇÁúÀûÀÎ ÇÙ½ÉÀÔ´Ï´Ù.
 
// ¸ÂÀ¸¸é 0, Ʋ¸®¸é 1À» ¹ÝȯÇÕ´Ï´Ù.
if(theApp.IsThatRight(theApp.GetSerial()))
{
 
// ¸ÂÀ¸¸é 0À» ¹ÝȯÇÏÁÒ. ÀÌ ¸®ÅÏÀº ´©°¡ ¹Þ´À³Ä? ´©±¸±ä ´©±¸°Ú¾î¿ä. ÀνºÅç ½¯µå¿¡¼ ¹ÞÁö¿ä.
return true;
}
else
{
 
// ±×·³ ¿©±â¼ ¹®Á¦. ÀÌ ¸®ÅÏÀº ´©°¡ ¹ÞÀ»±î¿ä?
 
// ¿¹.. ¸Â½À´Ï´Ù. õÀç½Ã±º¿ä.¤»
return false;
}
}
ÀÌ·¸°Ô ÇÔ¼ö¸¦ ±¸ÇöÇØÁÝ´Ï´Ù. ¹°·Ð ¿©±â ÀÌ ÇÔ¼ö ³»¿¡¼ ÇÊ¿äÇÑ ÀÛ¾÷À» ´Ù ¸¶Ãĵµ ÁÁ°ÚÁö¿ä. ÇÏÁö¸¸ ³ª C++Á» ¹è¿ü¼Ò~Çϰí
»ËÁ» ³»¾ßÁÒ.¤¾¤¾. IsThatRightÇÔ¼ö·Î ½Ã¸®¾óÀ» üũÇÏ´Â ºÎºÐÀº ¿©·¯ºÐÀÌ ¾Ë¾Æ¼ ¸¸µå½Ã±æ ¹Ù¶ø´Ï´Ù.
¸Ó...123456789ÀÌ·¸°Ô ¾ÆÈ©ÀÚ¸® ÀÔ·ÂÇØ¼ °¢ ÀÚ¸® ´Ù ´õÇϸé 45°¡ ³ª¿À°Ô ÇÏ´Â °É ÇÒ ¼öµµ ÀÖ°ÚÁÒ?
¾Æ´Ô 999990000À¸·Î ÇØµµ 45°¡ ³ª¿À´Ï..±Ùµ¥ ÀÌ°Ç ±Ý¹æ ¾Ë°ÚÁÒ?¤»¤»
4. ÀÚ~~µåµð¾î dllÇÔ¼ö¸¦ ´Ù ¸¸µé¾ú½À´Ï´Ù. ±×·³ ÄÄÆÄÀÏ ÇØ¾ßÁÒ. Ctrl+F5·Î ¸±¸®Áî ÄÄÆÄÀϸµÇÕ´Ï´Ù.
Ȥ, dllÀÌ Å©±â°¡ ±²ÀåÈ÷ ÀÛÀº kb´ëÀÇ ¿ë·®À» º¸ÀÌ¸é ¾Æ±î ÇÁ·ÎÁ§Æ® »ý¼ºÇÒ ¶§, µ¿Àûdll·Î ½Ç¼ö·Î ¸¸µç°Ô ¾Æ´Ñ°¡ ÀǽÉÇØº¸¼Å¾ß ÇÕ´Ï´Ù.
¾ÆÁÖ °£´ÜÇÏ°Ô ±¸ÇöÇØµµ 1.25MB°¡ ³ª¿É´Ï´Ù. ¤» µðÄÄÆÄÀÏÇØ¼ ½Ã¸®¾ó»ý¼º¿ø¸® µéų¸¸ÇÑ ¸¸¸¸ÇÑ ¿ë·®Àº ¾Æ´ÏÁÒ?
5. ±×·³ ÀÌ°É ¾µ±î¿ä? ¾Æ´ÏÁÒ..½Ã¸®¾ó ÅØ½ºÆ® ÆÄÀÏÀ» ¸¸µé¾î¾ßÁÒ. ÀڱⰡ ¸¸µç ÇÁ·Î±×·¥ ÀڱⰡ ½Ã¸®¾ó ¸ð¸¥´Ù¸é À̰м¼»ó¿¡ ´©°¡ ¾¹´Ï±î?
±×·±Àǹ̿¡¼ VC++¸¦ ¶Ç ÄÕ´Ï´Ù. ÇÁ·ÎÁ§Æ® Çϳª »ý¼ºÇϽñ¸¿ä. À̹ø¿£ txtÆÄÀÏ·Î Ãâ·ÂÇÏ´Â °úÁ¤À» ±¸ÇöÇÕ´Ï´Ù.
¿¹¸¦ µé¾î 10ÀÚ¸®¼ö¶óÇϸé 0000000000ºÎÅÍ 9999999999±îÁö´Ï±î ÃÑ 99¾ï°³(¸Â³ª?)ÀÇ ½Ã¸®¾ó ¹üÀ§°¡ »ý¼ºµÇ°ÚÁÒ?
À̰ÍÀ» for(i=0 ; i<999999999 ; i++)·Î µ¹·Á¼ dll·ÎºÎÅÍ ¸®ÅÏÀÌ
trueÀÎ °æ¿ì¸¸ µû·Î ±â·ÏÇØ¼ txtÀÇ ³¡ºÎºÐ¿¡ \nÇϰí ÀúÀåÇϽøé
³ªÁß¿¡ º¸±âÁÁ°Ô ¿Ã¹Ù¸¥ ½Ã¸®¾ó¸¸ Âß~~³ª¿À°Ô µÇÁö¿ä.(¾ÆÀ̱¸ ÀÌ»µ¶ó~) ¹°·Ð ½Ã°£Á» °É¸³´Ï´Ù.
Àú´Â ¾ÆÁÖ ±×³É °£´ÜÇÏ°Ô ¼ýÀڷθ¸ Çߴµ¥¿ä. ÇÊ¿äÇÏ½Ã´Ù¸é ¹®ÀÚ ¹× Ư¼ö¹®ÀÚ, À¯´ÏÄÚµå¿Í 8, 16Áø¼ö, ºñÆ®¿¬»êÀÚ¸¦ µ¿¿øÇؼ
½Ã¸®¾óÀ» °ËÁõÇÏ´Â ¹æ¹ýµµ ÀÖ½À´Ï´Ù. ¸Ó...ÇÏÀÚ¸é ÇÒ¼ö ÀÖ°ÚÁö¸¸, ´©°¡ ÀÎÅͳݿ¡ À̰ÍÀÌ ÀÌ Çñ׷¥ÀÇ ¾¾¸®¾óÀÌ¿À~ÇÏ°í ³»³õÀ¸¸é
°í»ýÇØ¼ ¸¸µç°Ô ¹°°ÅǰÀÌ µÇ´Ï±î¿ä. ³Ê¹« ¸¹Àº ³ë·ÂÀ» ±â¿ïÀÌ½Ã´Â°Ç ¹èº¸´Ù ¹è²ÅÀÌ ´õÅ« »óȲÀÌ µÇ°ÚÁÒ. ¸Ó......ÀÚÀ´´Ï´Ù.¤»
±×·³ À̰ɷΠdllÀ» ¸¸µé°í dll·ÎºÎÅÍ txtÆÄÀÏ·Î ½Ã¸®¾óµµ ÃßÃâÇß½À´Ï´Ù.´ÙÀ½Àº ÀÌ dllÀ» ÀνºÅ罯µå¿¡ ¾¥¼Å ³Ö¾î¾ß °ÚÁÒ?
[3´Ü°è - ½Ã¸®¾ó ³Ñ¹ö üũÇÒ °úÁ¤ ¸¸µé±â]
ÀÚ~ ȯ°æÀº °®ÃçÁáÀ¸´Ï ÀÎÁ¦ºÎÅÏ ÂüÀ¸·Î Àç¹ÌÀÖ°í, Â¥Áõ³ª´Â ½ºÅ©¸³µå³îÀ̸¦ ½ÃÀÛÇØ¾ßÁÒ. º°°Å ¾ø½À´Ï´Ù. ¸Ó µû¶óÇϼ¼¿ä.
0. Behavior and Logic¿¡¼ InstallScript¸¦ µÎ¹ø Ŭ¸¯ÇÕ´Ï´Ù. ±×·³ ¿À¸¥ÂÊ¿¡ âÀÌ µÎ°³°¡ ¶ßÁÒ. ±Ùµ¥ °¡¿îµ¥°ÍÀº º°º¼ÀÏ ¾ø±¸¿ä.
¿À¸¥ÂÊÀÌ Áß¿äÇÕ´Ï´Ù.
1. function OnFirstUIBefore() ¶ó°í µÇÀÖ´Â ºÎºÐÀ» ã½À´Ï´Ù.
±×¸®°í´Â Dlg_SdWelcome:, Dlg_SdLisence:..¸Ó ÀÌ·¸°Ô Dlg·Î ½ÃÀÛÇÏ´Â '³ª ´ëÈ»óÀÚ¿ä~'ÇÏ°í ³»³õ°í ¹öƼ°í ÀÖ´Â ±¸¹®µéÀ» º¼¼öÀִµ¥¿ä.
c/c++¿¡¼ Switch¹® ¾ÈÂÊÀÇ ±×...¸Ó³Ä...±×....°Å½Ã±â¶ó°í º¸½Ã¸é µË´Ï´Ù.
case serialmanse...ÀÌ·±°Å ¸»ÀÌÁÒ.
¾î·µç Event_Drivenó·³ À̺¥Æ®¿¡ µû¶ó µ¿ÀÛÇÏ´Â°Í °°Àºµ¥¿ä. À§¿¡¼ºÎÅÍ Â÷·Ê´ë·Î´Â ¾Æ´Ï±¸¿ä. goto¹®¿¡ µû¶ó ºÐ±â°¡ µË´Ï´Ù.
º¸ÅëÀº Dlg_SdWelcome:ºÎÅÍ ½ÃÀÛÇÏÁö¿ä.
±×·³ ¿©±â¼ ¼ø¼¸¦ Á¤Çغ¼±î¿ä?
"ȯ¿µ¸Þ¼¼Áö"->"½Ã¸®¾ó üũÇϱâ"->"¶óÀ̼¾½º º¸±â"->"ÇÁ·Î±×·¥ °æ·ÎÁöÁ¤" Á¦ÀÏ ¹«³ÇÏÁÒ?
ÀÌ ¼ø¼´Â Dlg_SdWelcome: -> Dlg_SdRegisterUserEx: -> Dlg_SdLicense: -> Dlg_SdAskDestPath: µÇ°ÚÁÒ.
Á¦ÀÏ Ã³À½¿¡ ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇϸé Dlg_SdRegisterUserEx:°¡ ¾øÁö¿ä.¸Ó...'³ª ÀÖ¾î~'ÇÏ½Ã¸é ¿ôÁö¿ä.
¾î·µç Àü ¾ø¾ú´Âµ¥¿ä. ÀÌ·¸°Ô ÄÚµùÀ» ÇØÁá½À´Ï´Ù.
 
// function OnFirstUIBefore() À§¿¡´Ù°¡ ¾Æ·¡¿Í °°ÀÌ ¼±¾ðÇØÁà¾ß ÇÕ´Ï´Ù. ¾ÈÇÏ¸é ¾ÈµÇ¿ë.
 
// µÚ¿¡ ÇÔ¼ö¸íÀº dllÀÇ ±×°Í°ú °°¾Æ¾ßÁÒ.
prototype cdecl INT SerialManSe.SerialManSe_CheckCheckCheck(BYREF STRING);
 
//¾Æ·¡´Â function OnFirstUIBefore() ÀÇ Àú ±í¼÷ÇÑ °÷¿¡ ¾¹´Ï´Ù.
Dlg_SdRegisterUserEx:
 
///////////////////////////////////////////////////////////////////
szMsg =
"";
szTitle =
"";
svSerial =
"";  
//ÇÊ¿äÇÑ º¯¼ö´Â ÇÔ¼ö ùºÎºÐ (beginÀÌÀü¿¡)¿¡¼ ÇÊ¿äÇѸ¸Å ¼±¾ðÇÕ´Ï´Ù.
szDLLName = SUPPORTDIR^
"SerialManSe.dll";
 
// Âü°í...ÀÌÀü¿¡ UseDLL¿¡ szDLLName·Î °£Á¢ÀûÀ¸·Î Áý¾î³ÖÁö ¾Ê°í SUPPORTDIR^"SerialManSe.dll"¸¦ ÆÄ¶ó¹ÌÅÍ·Î
 
// Á÷Á¢ÀüÇØÁá´Âµ¥, ¿¡·¯³ª´õ±º¿ä. ±×·¡¼ #defineÀ̳ª ÀÌ·¸°Ô º¯¼ö·Î Àü´ÞÇØÁÝ´Ï´Ù.
bResult = UseDLL(szDLLName);  
//À̰оÆÁÖ Áß¿äÇÏÁÒ. ¾Æ±î ¸¸µç dllÀ» ºÒ·¯¿À´Â ÇÔ¼ü´Ï´Ù.
SdRegisterUserEx(szTitle, szMsg, svName, svCompany, svSerial);
 
// ¸Ç ¸¶Áö¸· ÆÄ¶ó¹ÌÅͰ¡ Áß¿äÇÏÁÒ. ¿©±â¿¡ »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ ½Ã¸®¾ó(*·Î Ç¥½ÃµÇ´Â)ÀÌ µé¾î¿ÀÁÒ. ÀÌ°É dllÀÇ ÇÔ¼ö·Î ³Ñ±â´Â °Ì´Ï´Ù.
if(bResult = 0) then
//¿Ã¹Ù¸¥ ·ÎµùÀÌ µÇ¾úÀ½À» ÀǹÌÇÏÁÒ. ·Îµù ¾ÈµÇ¸é ¸»Â¯ ²ÎÀÌ´Ï ¿¹¿Ü󸮸¦ ÇØÁÖ¼Å¾ß ÇÕ´Ï´Ù.
 
// À̰оÈÇØÁÖ¸é 0x80040702¿¡·¯ ³¯ ¼öµµ ÀÖ½À´Ï´Ù.(°¡~²û¿ä)
bRet = SerialManSe_CheckCheckCheck(svSerial);  
//À̰ŠÇÙ½ÉÀÌÁÒ. ½Ã¸®¾ó üũÇÏ´Â °Ì´Ï´Ù. ÆÄ¶ó¹ÌÅÍ...¾Æ±î °Á¶Çß´ø ±×³ðÀÌÁÒ.
 
//¸®ÅϹ޾ÒÁÒ. ±×·³ ¸®ÅϰªÀ» Æò°¡Çؾ߰ÚÁÒ?
if(bRet = TRUE) then  
//Æò°¡ÇØÁÝ´Ï´Ù. '±×°ªÀÌ ¾Ë°íº¸´Ï ¸ÂÀ»°Í °°±âµµ ÇÏ»ï~'ÇÏ°í ¸®Åϵé¾î¿À¸é ´Ù¸§ ÆÄÆ®ÀÎ ¶óÀ̼¾½º·Î ¿Å°Ü¾ßÁö¿ä.
UnUseDLL( szDLLName );  
//¿Å±â±âÀü¿¡ dll '¾È»ç¿ë'ÇØÁÖ°í¿ä.¤»
goto Dlg_SdLisence;  
//¶óÀ̼¾½º·Î ¿Å±é´Ï´Ù.
else  
//¸®ÅÏÀÌ Æ²·È´Ù³×¿ä.
MessageBox(
"È¥³¯·¡? Á¦´ë·ç ½á~! ¾ð´É!!!", INFORMATION );  
//»ç¿ëÀÚ¸¦ ¾Ð¹ÚÇÏ´Â ÇѸ¶µð..¤¾¤¾
UnUseDLL( szDLLName );
goto Dlg_SdRegisterUserEx;  
//Ű ÀԷ¹޴ °÷À¸·Î µ¹¾Æ°©´Ï´Ù.
endif;
else  
//¾îÀÌÄí ¶óÀ̺귯¸®°¡ ¾ø´Ù³×¿ä. ÀÌ·± ºÒ½Ö»ç´Â ¾ø¾î¾ßÁÒ. ±Ùµ¥, µ¿Àûdll·Î dll¸¸µå½É ÀÌ ¸Þ¼¼Áö ¶å´Ï´Ù.
MessageBox(
"¾î¼¶ó°í~? ÇÏ´ÃÀ» ºÁ¾ß º°À» µûÁö.", WARNING);
UnUseDLL( szDLLName );
abort;
endif;
if (nResult = BACK)
goto Dlg_SdWelcome;
-----------------------------------
ÀÚ~~Àε¥ ½ºÅ©¸³Æ®µµ ´ÙµÆ½À´Ï´Ù. °£È¤ ¿ÞÂÊâÀÇ User Interface¿¡¼ Dialog¸¦ ¸¸Áö´Â ºÐÀÌ °è½Åµ¥¿ä.
À§Ä¡¹Ù²Ù°í. Å©±â Á¶Á¤Çϴµ¥´Â ÇÊ¿äÇØµµ ½Ã¸®¾ó üũÇϴ°Ͱú´Â º° °ü·ÃÀÌ ¾ø´ä´Ï´Ù.
2. ´ÙÀ½...dllÀ» ÇÁ·ÎÁ§Æ®·Î °¡Á®¿Í¾ß°ÚÁö¿ä? Behavior and Logic¿¡¼ SupportFile / Billboard¸¦ Ŭ¸¯ÇÕ´Ï´Ù.
±×·³ º°º¼ÀÏ ¾ø´Â ¿À¸¥ÂÊâ°ú ÂÉ±Ý º¼ÀÏÀÖ´Â °¡¿îµ¥ âÀÌ ³ªÅ¸³ªÁö¿ä. ÀÌ Æ®¸® °¡¿îµ¥¼ ¸Ç À§¿¡ Language Independent¸¦
Ŭ¸¯ÇÕ´Ï´Ù. ±×·³ ¸Ç ¿À¸¥ÂÊ Ã¢¾Ö º°º¼ÀÏÀÌ »ý±é´Ï´Ù. ¸¶Ä¡ ÆÄÀÏ Å½»ö±â °°Áö¿ä?
¿À¸¥ÂÊ ¹öưÀ¸·Î InsertÆÄÀÏ À» ´·¯¼ ¾Æ±î ¸¸µç dllÆÄÀÏÀ» °¡Á®¿É´Ï´Ù.(±×·³ ±× ¿ë·®¸¸Å ¼Â¾÷ÆÄÀÏ ±Ô¸ð°¡ Ä¿Á®¿ë.)
----³¡~~~----------
³¡³µ½À´Ï´Ù. ÀÎÁ¦ ºôµå ÇÏ¸é µË´Ï´Ù. ¸Ó dependency scanner·Î Âß ºÒ·¯¿ÍÁִ°ŠÂü ÁÁ°í¿ä. ÀÎÁ¦ ¸¾³õ°í ºôµåÇϽñ⠹ٶø´Ï´Ù.
¸Ó...Ãʺ¸ÀÚ°¡ À̶§±îÁö °í»ý°í»ýÇÏ¸é¼ ½Ã¸®¾ó üũºÎºÐ ¸¸µé¾ú´ø°Å µÎ¼¾øÀÌ ½è´Âµ¥¿ä. Áß ¹× °í¼öºÐµéÀº ºÎµð º¸Áö ¸¶½Ã°í,
ÃÊÂ¥ºÐµéÀº Àú¿Í°°ÀÌ °í»ýÇÏÁö ¸¶½Ã¶ó´Â ÀǹÌÇØ¼ ÀÌ·¸°Ô ½è¾¹´Ï´Ù.
ÁÁÀº ÇÏ·ç µÇ½Ã±¸¿ä. °¨»çÇÕ´Ï´Ù~~~