±ÍÇÏ´Â ¼Õ´Ô À̽ʴϴÙ
·Î±×ÀÎ
ȸ¿ø°¡ÀÔ
  
  µ¨¸¶´ç °ø½Ä ÀºÇà°èÁÂ
  ÇϳªÀºÇà 227-910235-83607
  ¿¹±ÝÁÖ ÀÌ»ó±¹(¿î¿µÁø)
ÇÁ·ÎÁ§Æ® °Ô½ÃÆÇ
ÅõÇ¥°Ô½ÃÆÇ
µ¨¸¶´ç¼Ò°³
±âÃʺÎÅÍ È°¿ë±îÁö! µ¨ÆÄÀÌ ±³À° - µ¥ºê±â¾î
Áú¹®°ú ´äº¯ Áú¹®°ú ´äº¯ ÀÔ´Ï´Ù.
±Û³»¿ë - Áú¹®°ú ´äº¯
 [Áú¹®] Delphi¿¡¼­ C·Î ÀÛ¼ºµÈ DLLÈ£ÃâÁß access violation ¿¡·¯°¡ ¹ß»ýÇؼ­ ¹®Àǵ帳´Ï´Ù.
´Ê±ï±âµ¨ÇǾð
(¹Úżº)
2017-10-16 ¿ÀÀü 8:27:34
898ȸ Á¶È¸


µî·ÏµÈ ÆÄÀÏÀÌ ¾ø½À´Ï´Ù.
1. °³¹ß/½ÇÇà Ç÷§Æû 
  (1) OS : Win10
  (2) °³¹ßÅø : Berlin
  (3) »ç¿ë Database : No

2. °³¹ß ÁßÀΠÇÁ·Î±×·¥ 

3. Áú¹® ³»¿ë 

 C·Î ÀÛ¼ºµÈ Äڵ带 µ¨ÆÄÀ̷ΠÆ÷ÆÃÁßÀÔ´Ï´Ù. 
 DllÂÊÀº ±×´ë·Î C++·Î ÀÛ¼ºµÈ°É ±×´ë·Î »ç¿ëÇÏ°í È£ÃâÇÏ´ÂÂʸ¸ µ¨ÆÄÀ̷ΠÆ÷ÆÃÇÒ·Á°í Çϴµ¥ ¿¡·¯°¡ ³ª´Âµ¥
 µð¹ö±ëÀ» ¾î¶»°Ô ÇØÁà¾ß ÇÒÁö ¸ô¶ó¼­ Áú¹®µå¸³´Ï´Ù.

<<Dll ºÎºÐ>

typedef struct structDRIVERINFO {
  wchar_t Product_Name[48]; /// Á¦Ç°¸í
  wchar_t Driver_Name[48]; /// µå¶óÀ̹ö À̸§
  wchar_t Author[32]; /// µå¶óÀ̹ö Á¦ÀÛÀÚ
  int VersionH; /// ¹öÀü major
  int VersionL; /// ¹öÀü Minor
  wchar_t Description[64]; /// ¼³¸í
  wchar_t STX[128];
  wchar_t ETX[128];
  bool UseArraySTX;
  bool UseArrayETX;
  bool StartAtFirstBuffer;
  bool RestartAtSTX;
  bool STXAsDataSeparator;
} DriverInformation;

extern "C" __declspec(dllexport) void _f_GetDriverInfo(DriverInformation *Info)
{
  wcscpy(Info->Product_Name, PRODUCT_NAME);
  wcscpy(Info->Driver_Name, DRIVER_NAME);
  wcscpy(Info->Author, AUTHOR_NAME);
  wcscpy(Info->Description, DRIVER_DESC);
  Info->VersionH = VERSION_H;
  Info->VersionL = VERSION_L;
  wcscpy(Info->STX, START_CHAR);
  wcscpy(Info->ETX, END_CHAR);
  Info->UseArraySTX = USE_ARRAY_STX;
  Info->UseArrayETX = USE_ARRAY_ETX;
  Info->StartAtFirstBuffer = START_AT_FIRSTBUFFER;
  Info->STXAsDataSeparator = STX_AS_DATASEPARATOR;
}

<µ¨ÆÄÀÌ ÂÊ>
PDriverInformation = ^TDriverInformation;
TDriverInformation = record
  Product_Name: array[0..47] of Char; /// Á¦Ç°¸í
  Driver_Name: array[0..47] of Char; /// µå¶óÀ̹ö À̸§
  Author: array[0..31] of Char; /// µå¶óÀ̹ö Á¦ÀÛÀÚ
  VersionH: integer; /// ¹öÀü major
  VersionL: integer; /// ¹öÀü Minor
  Description: array[0..63] of Char; /// ¼³¸í
  STX: array[0..127] of Char;
  ETX: array[0..127] of Char;
  UseArraySTX: Boolean;
  UseArrayETX: Boolean;
  StartAtFirstBuffer: Boolean;
  RestartAtSTX: Boolean;
  STXAsDataSeparator: Boolean;
end;
  
function TMSDKDriver.VerifyDriver(Info: PDriverInformation): Boolean;
begin
  result := false;
  if DriverInstance = 0 then
    DriverInstance := LoadLibrary(PChar(FDriverFileName));
  if DriverInstance = 0 then exit;

  f_GetDriverInfo := GetProcAddress(DriverInstance, '__f_GetDriverInfo');
  if @f_GetDriverInfo = nil then exit;

  f_GetDriverInfo(Info);
  PrintLog('DriverManager : [DRIVER] Product Name : %s', [Info.Product_Name]);
  PrintLog('DriverManager : [DRIVER] Driver Name : %s', [Info.Driver_Name]);
end;

f_GetDriverInfo(Info); ÁÙ¿¡¼­ access violation ¿¡·¯°¡ ³³´Ï´Ù. 

exe¿Í dll·Î ºÐ¸®µÇ¾î À־ ºê·¹ÀÌÅ·Æ÷ÀÎÅ͸¦ °É¾î¼­ ÇÔ¼ö³»ºÎ·Î µé¾î°¡ º¼·Á°í Çصµ ¹æ¹ýÀ» Àß ¸ð¸£°Ú³×¿ä.


¿©±â¼­ Áú¹®

if @f_GetDriverInfo = nil then exit; 

Àº ½ÇÇàÀÌ µÇ¹Ç·Î ÀÏ´Ü ÇÔ¼ö¸¦ È£ÃâÇϴ°ͱîÁö´Â ¹®Á¦°¡ ¾ø´Â°Í °°Àºµ¥ ±×·³ ÇÔ¼öÀÎÀÚÀÇ ¹®Á¦°¡ ¾Æ´Ò±î

ÀǽÉÀÌ µË´Ï´Ù. C ±¸Á¶Ã¼¿Í Á¦°¡ Æ÷ÆÃÇÑ Delphi ±¸Á¶Ã¼°¡ µ¿ÀÏÇÑ°ÍÀÎÁö ±Ã±ÝÇÕ´Ï´Ù.


¸¸¾à ÀÎÀÚ¿¡ ÀÌ»óÀÌ ¾ø´Ù¸é ¾î´ÀÂÊÀ» »ìÆìºÁ¾ß ÇÒ±î¿ä?