¾È³çÇϼ¼¿ä °íµå¸§ ±èÁ¤ÀÔ´Ï´Ù.
¾Æ·¡¿¡ ÀÛ¼ºÇÏ´Â ³»¿ëÀº Á¦°¡ ÀÛ¾÷Çؼ ¾²´Â ¹æ¹ýÀÔ´Ï´Ù.
µû¶ó¼ °¡Àå ÃÖ¼±ÀÇ ¹æ¹ýÀ̶ó°í´Â ÇÒ ¼ö ¾ø½À´Ï´Ù. ±×Á¡À» ¾çÇØÇØÁֽñ⠹ٶø´Ï´Ù.
***
1. VC++ ÀÛ¾÷ÇÑ DLLÀ» µ¨ÆÄÀÌ¿¡¼ »ç¿ëÇϱâ
¿ì¼± ÇÔ¼ö ÆĶó¹ÌÅ͸¦ Àß È®ÀÎÇÏ¼Å¾ß ÇÕ´Ï´Ù. ÀÌ°ÍÀÌ ¹½ÀÌ³Ä Çϸé, µ¨ÆÄÀÌ(ÆĽºÄ®°è¿)À̳ª C °è¿Àº ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§ ÆĶó¹ÌÅ͸¦ ½ºÅÿ¡ ³Ö°í »©´Â ¼ø¼°¡ ´Ù¸£°Åµç¿ä..
´ÙÀ½Àº ±× ±¸ºÐÀÔ´Ï´Ù.
Directive Parameter order Clean-up register »ç¿ë ¿©ºÎ ------------------------------------------------------------------------------- register Left-to-right Routine Yes pascal Left-to-right Routine No cdecl Right-to-left Caller No stdcall Right-to-left Routine No safecall Right-to-left Routine No
(*µ¨ÆÄÀÌ5 ÇïÇÁ¿¡¼ ¹ßÃé. ¾î´À ¹öÀüÀÌµç ¶È°°À½*)
À§¿¡ º¸½Ã¸é cdecl ¹æ½ÄÀÌ ÀÖ½À´Ï´Ù. cdecl ¹æ½ÄÀÌ C/C++¿¡¼ »ç¿ëµÇ´Â ÇÔ¼ö È£Ãâ ¹æ½ÄÀÇ Ç¥ÁØÀÔ´Ï´Ù.
¹°·Ð ÇÔ¼ö¸¦ ¼±¾ðÇÒ ¶§ ´ÙÀ½°ú °°ÀÌ Ç¥½ÃÇÕ´Ï´Ù.
procedure testproc( param1 : integer; param2 : pchar ); cdecl;
ÇÁ·Î½ÃÀú°¡ ¾Æ´Ï¶ó ÇÔ¼öÀÏ °æ¿ì´Â,
function testfunc( param1 : integer; param2 : pchar ) : integer; stdcall;
º¸ÅëÀº DLL·Î exportÇÏ´Â ÂÊ¿¡¼ »ç¿ëÇÏ´Â ÂÊÀÇ ¹æ½ÄÀ» ¸ÂÃä´Ï´Ù.
APIÇÔ¼öµéÀÇ °æ¿ì´Â PASCAL ŸÀÔÀ» ¸¹ÀÌ ¾²°í, µ¨ÆÄÀ̳ª C-BuilderÀÇ °æ¿ì´Â stdcall ¶Ç´Â safecallÀ» ¾²´Â °ÍÀ» ¾Æ½ÃÁÒ??
µû¶ó¼ VC++¿¡¼ ±×³É exportÇϼ̴ٸé, µ¨ÆÄÀÌ ÂÊ¿¡¼ ¼±¾ðÇÏ´Â ºÎºÐ¿¡ cdecl ¹æ½ÄÀ» ³Ö¾îÁÖ¼¼¿ä...
ÇÔ¼ö¸íÀº C/C++¿¡¼ »ç¿ëÇϽŠ±×´ë·Î ¾²¼¼¿ä.(´ë¼Ò¹®ÀÚ ±¸ºÐÇؼ¿ä.) ÇÔ¼ö¸íÀ» Á¤È®ÇÏ°Ô ¾²Áö ¾Ê´Â °æ¿ì ¸µÅ©¿¡·¯°¡ ³¯¼ö ÀÖ½À´Ï´Ù.
±×¸®°í, ÁÖÀÇ ÇÏ½Ç ºÎºÐÀÌ ÀÖ½À´Ï´Ù.
¹Ù·Î ½ºÆ®¸µÀ» ³Ñ±â´Â ºÎºÐÀÌÁö¿ä. À§¿¡ ÇÔ¼ö ¼±¾ðó·³ PCHAR·Î ¹ÞÀ¸¸é µÇÁö¸¸, °¡²ûÀº ¹®Á¦°¡ µÇ´Â °æ¿ìµµ ÀÖ´õ±º¿ä.
·¹ÆÛ·±½º ÂüÁ¶¶§¹®ÀÎ °Í °°Àºµ¥, ±×·± °æ¿ì¿¡ Æ÷ÀÎÅ͸¦ Çϳª ´õ ´Þ¾ÆÁֽøé ÇØ°áÇÏ½Ç ¼ö ÀÖ½À´Ï´Ù.
Á¦ °æ¿ì¿¡´Â µ¨ÆÄÀÌ¿¡¼ ÇÔ¼ö Æ÷ÀÎÅ͸¦ ³Ñ°ÜÁÖ°í, ÄݹéÇÔ¼ö·Î ¹öÆÛÀÇ Æ÷ÀÎÅÍ°¡ ³Ñ¾î¿À´Âµ¥, ÀÌ°ÍÀ» PCHAR·Î ¹Þ¾Æ¼ ¾²¸é Access ViolationÀÌ ³ª´õ±º¿ä, ±×·¡¼ PPCHAR = ^PCHAR ¸¦ ¼±¾ðÇؼ PPCHAR·Î ¹Þ¾Æ¼, buf^·Î »ç¿ëÇß½À´Ï´Ù.
(*°á·Ð*)
*** VC++¿¡¼ ¼±¾ðÇϱâ (Export)
extern "C" __declspec(dllexport) int __cdecl btInputText(char *buf, int ch) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); return(InputText(buf, ch)); }
*** DELPHI¿¡¼ ¼±¾ðÇϱâ (Import)
interface
procedure btInputText( Buf : PChar; ch : integer ); cdecl;
implementation
procedure btInputTex; external 'test.dll'; cdecl;
À§¿Í °°ÀÌ ÇÏ½Ã¸é µË´Ï´Ù.
±×¸®°í µ¿Àû¸µÅ©µµ ÀÖ°ÚÁÒ. LoadLibrary¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀε¥, ¾îÂ÷ÇÇ À§Ã³·³ ¼±¾ðÇصµ µ¿ÀûÀΰŠ¾Æ´Ñ°¡ ½Í±âµµÇÏ°í.. ^^
ÀÏ¹Ý µ¨ÆÄÀÌ ¼Àû¿¡ ´õ ÀÚ¼¼È÷ ³ª¿ÍÀÖÀ»°Ì´Ï´Ù. Âü°íÇϽðí¿ä,
2. µ¨ÆÄÀÌ·Î ¸¸´Â DLLÀ» VC++¿¡¼ »ç¿ëÇϱâ
¹¹ À§¿Í ¹Ý´ë´Ï±î º°·Î Â÷ÀÌ´Â ¾ø½À´Ï´Ù. ´Ù¸¸ VC++ÀÇ °æ¿ì ¸µÅ© »óÀÇ ¹®Á¦·Î ÀÎÇÏ¿©,
LIBÆÄÀÏÀÌ ÀÖ´ø°¡, ¾Æ´Ï¸é LoadLibrary¸¦ »ç¿ëÇÏ¼Å¾ß ÇÕ´Ï´Ù.
µ¨ÆÄÀÌ¿¡¼ DLLÀ» ¸¸µé¸é LIB°¡ »ý±âÁö ¾Ê´Â °ü°è·Î, (Á¦ »ý°¢ÀÔ´Ï´Ù. ¾îÂîÇÏ¸é »ý±â´Â ÁÙµµ.. ±×·±°¡??)
Àú´Â ÁÖ·Î LoadLibrary¸¦ »ç¿ëÇÕ´Ï´Ù.
±× °úÁ¤Àº ´ÙÀ½°ú °°½À´Ï´Ù.
(µ¨ÆÄÀÌ·Î DLL¸¸µå´Â °úÁ¤Àº »ý·«! ´Ù¸¸ cdecl »©¸ÔÁö ¸¶¼¼¿ä~)
(1). ÇÔ¼ö Æ÷ÀÎÅÍ ¼±¾ðÇϱâ
typedef int (__cdecl *Pgetgroup)(char* PID, char* PIDpwd, int GroupNum, char* MailAddr);
Pgetgroup getgroup;
(2). DLL ºÎ¸£±â
(MFCÀÇ °æ¿ì¶ó¸é OnInitDialog() ³»¿¡ ¼±¾ðÇÏ°ï ÇÕ´Ï´Ù.¾Æ½ÃÁÒ?)
theDLL = LoadLibrary("test.dll"); getgroup = (Pgetgroup)GetProcAddress((HMODULE)theDLL, "getgroup");
(3). ÇÔ¼ö »ç¿ë
char PID[30] = {"godrm"}; char PIDpwd[10] = {"1234"}; char GroupAddr[512] = {""}; int GroupNum = 1;
if (getgroup( PID, PIDpwd, GroupNum, GroupAddr )<0) { MessageBox( "Fail" ); }
ÀÌ»óÀÔ´Ï´Ù.
¿Â¶óÀÎ »ó¿¡¼ ´ëÃæ ºÙ¿©³Ö°í Çß´õ´Ï¸¸, Á¤¸®°¡ ¾î¶»°Ô µÆ´ÂÁö ¸ð¸£°Ú³×¿ä.
Âü°í°¡ µÇ½Ã±æ ¹Ù¶ø´Ï´Ù. ÀÌ ±ÛÀ» º¸½Ã°íµµ Á¤¸®°¡ ¾È µÇ½Ã¸é, ´Ù½Ã Áú¹®Çϼ¼¿ä. ÀÚ¼¼ÇÏ°Ô~ ¸ÞÀÏÀ» º¸³»¼Åµµ ½Ã°£µÇ´Âµ¥·Î(?) ´äº¯Çص帮°Ú½À´Ï´Ù.
ÁñÆõǼ¼¿ä..±×¶÷..
|