±ÍÇÏ´Â ¼Õ´Ô À̽ʴϴÙ
·Î±×ÀÎ
ȸ¿ø°¡ÀÔ
  
  µ¨¸¶´ç °ø½Ä ÀºÇà°èÁÂ
  ÇϳªÀºÇà 227-910235-83607
  ¿¹±ÝÁÖ ÀÌ»ó±¹(¿î¿µÁø)
ÇÁ·ÎÁ§Æ® °Ô½ÃÆÇ
ÅõÇ¥°Ô½ÃÆÇ
µ¨¸¶´ç¼Ò°³
±âÃʺÎÅÍ È°¿ë±îÁö! µ¨ÆÄÀÌ ±³À° - µ¥ºê±â¾î
Áú¹®°ú ´äº¯ Áú¹®°ú ´äº¯ ÀÔ´Ï´Ù.
±Û³»¿ë - Áú¹®°ú ´äº¯
 [´äº¯] VC++ DLLÀ» µ¨ÆÄÀÌ¿¡¼­ ¾²±â/¹Ý´ë·Î
±èÁ¤
(¼Õ´Ô)
1999-12-03 ¿ÀÈÄ 7:01:00
10042ȸ Á¶È¸


µî·ÏµÈ ÆÄÀÏÀÌ ¾ø½À´Ï´Ù.
¾È³çÇϼ¼¿ä
°íµå¸§ ±èÁ¤ÀÔ´Ï´Ù.

¾Æ·¡¿¡ ÀÛ¼ºÇÏ´Â ³»¿ëÀº Á¦°¡ ÀÛ¾÷Çؼ­ ¾²´Â ¹æ¹ýÀÔ´Ï´Ù.

µû¶ó¼­ °¡Àå ÃÖ¼±ÀÇ ¹æ¹ýÀ̶ó°í´Â ÇÒ ¼ö ¾ø½À´Ï´Ù.
±×Á¡À» ¾çÇØÇØÁֽñ⠹ٶø´Ï´Ù.

***

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" );
}

ÀÌ»óÀÔ´Ï´Ù.

¿Â¶óÀÎ »ó¿¡¼­ ´ëÃæ ºÙ¿©³Ö°í Çß´õ´Ï¸¸,
Á¤¸®°¡ ¾î¶»°Ô µÆ´ÂÁö ¸ð¸£°Ú³×¿ä.

Âü°í°¡ µÇ½Ã±æ ¹Ù¶ø´Ï´Ù.

ÀÌ ±ÛÀ» º¸½Ã°íµµ Á¤¸®°¡ ¾È µÇ½Ã¸é, ´Ù½Ã Áú¹®Çϼ¼¿ä. ÀÚ¼¼ÇÏ°Ô~
¸ÞÀÏÀ» º¸³»¼Åµµ ½Ã°£µÇ´Âµ¥·Î(?) ´äº¯Çص帮°Ú½À´Ï´Ù.

ÁñÆõǼ¼¿ä..±×¶÷..