2009-12-11 11 views
1

나는 많은 dll 파일이 있고 나는 그들을 2 개의 다른 폴더 (PC와 PPC)로 선정하고 싶으면. 이 때문에 dll 파일의 대상 플랫폼이나 해당 플랫폼에 대한 다른 세부 정보를 알아야합니다.Python 3.1.1에서 dll의 대상 플랫폼 정보를 얻으려면 어떻게해야합니까?

저는 파이썬 3.1.1을 사용합니다. 나는이 Python 버전과 호환되지 않는 win32api를 시도했다. 그래서 try-except 메소드와 함께 ctypes.windll을 사용하려고했는데로드 된 dll이 "PC"이고 true가 아닌 경우 "PPC"인 dll을로드 할 수 없습니다. 그러나, 나는이 아이디어에 문제가있다.

내가 "PC"dll을 알고 있지만 메모리에로드 할 수없는 일부 dll 파일이 있습니다. try-except는 이들과 작동하지 않습니다. 그래서, 나는 자체의 타겟 플랫폼에 대한 dll 파일로부터 정보를 요청할 필요가있다.

이 문제에 대해 알고 계십니까?

감사합니다.

+0

적어도 실패의 예를 제공하십시오. 대화가있는 Windows 충돌일까요? 텍스트를 표시하십시오. 파이썬 예외입니까? 추적 표시. 다른 것? 당신은 우리를 추측하게 만듭니다. –

+0

또한 windll 대신 ctypes.cdll을 사용하여 이러한 라이브러리 중 일부를로드해야 할 수 있습니까? –

+0

imagehelp를 적절한 C WinAPI와 함께 사용하지 않는 이유는 무엇입니까? –

답변

0

dll 파일 구조를 기반으로 솔루션을 찾았습니다. 다음은 내 코드의 일부입니다.

def DLLIdentifier(self): 
    ''' 
    Microsoft Portable Executable and Common Object File Format Specification 
    http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx 

    After the MS DOS stub, at the file offset specified at offset 0x3c, 
    is a 4-byte signature that identifies the file as a PE format image file. 
    This signature is "PE\0\0" (the letters "P" and "E" followed by two null bytes). 
    At the beginning of an object file, or immediately after the signature of an image file, 
    is a standard COFF file header in the following format. 
    Note that the Windows loader limits the number of sections to 96. 
    The Machine field has one of the following values that specifies its CPU type. 
    An image file can be run only on the specified machine or on a system that emulates the specified machine. 
    ''' 
    Platform = 'UNKNOWN' 
    for Row in codecs.open(os.path.join(self.Root, self.File), 'rb'): 
     if b'\x00PE\x00\x00' in Row: 
      # IMAGE_FILE_MACHINE_UNKNOWN  0x0   The contents of this field are assumed to be applicable to any machine type 
      if b'\x00PE\x00\x00\x00\x00' in Row: 
       Platform = 'UNKNOWN' 
       break 
      # IMAGE_FILE_MACHINE_AM33   0x1d3  Matsushita AM33 
      elif b'\x00PE\x00\x00\xD3\x01' in Row: 
       Platform = 'AM33' 
       break 
      # IMAGE_FILE_MACHINE_AMD64  0x8664  x64 
      elif b'\x00PE\x00\x00\x664\x08' in Row: 
       Platform = 'AMD64' 
       break 
      # IMAGE_FILE_MACHINE_ARM   0x1c0  ARM little endian 
      elif b'\x00PE\x00\x00\xC0\x01' in Row: 
       Platform = 'ARM' 
       break 
      # IMAGE_FILE_MACHINE_EBC   0xebc  EFI byte code 
      elif b'\x00PE\x00\x00\xBC\x0E' in Row: 
       Platform = 'EBC' 
       break 
      # IMAGE_FILE_MACHINE_I386   0x14c  Intel 386 or later processors and compatible processors 
      elif b'\x00PE\x00\x00\x4C\x01' in Row: 
       Platform = 'I386' 
       break 
      # IMAGE_FILE_MACHINE_IA64   0x200  Intel Itanium processor family 
      elif b'\x00PE\x00\x00\x00\x02' in Row: 
       Platform = 'IA64' 
       break 
      # IMAGE_FILE_MACHINE_M32R   0x9041  Mitsubishi M32R little endian 
      elif b'\x00PE\x00\x00\x041\x09' in Row: 
       Platform = 'M32R' 
       break 
      # IMAGE_FILE_MACHINE_MIPS16  0x266  MIPS16 
      elif b'\x00PE\x00\x00\x66\x02' in Row: 
       Platform = 'MIPS16' 
       break 
      # IMAGE_FILE_MACHINE_MIPSFPU  0x366  MIPS with FPU 
      elif b'\x00PE\x00\x00\x66\x03' in Row: 
       Platform = 'MIPSFPU' 
       break 
      # IMAGE_FILE_MACHINE_MIPSFPU16 0x466  MIPS16 with FPU 
      elif b'\x00PE\x00\x00\x66\x04' in Row: 
       Platform = 'MIPSFPU16' 
       break 
      # IMAGE_FILE_MACHINE_POWERPC  0x1f0  Power PC little endian 
      elif b'\x00PE\x00\x00\xF0\x01' in Row: 
       Platform = 'POWERPC' 
       break 
      # IMAGE_FILE_MACHINE_POWERPCFP 0x1f1  Power PC with floating point support 
      elif b'\x00PE\x00\x00\xF1\x01' in Row: 
       Platform = 'POWERPCFP' 
       break 
      # IMAGE_FILE_MACHINE_R4000  0x166  MIPS little endian 
      elif b'\x00PE\x00\x00\x66\x01' in Row: 
       Platform = 'R4000' 
       break 
      # IMAGE_FILE_MACHINE_SH3   0x1a2  Hitachi SH3 
      elif b'\x00PE\x00\x00\xA2\x01' in Row: 
       Platform = 'SH3' 
       break 
      # IMAGE_FILE_MACHINE_SH3DSP  0x1a3  Hitachi SH3 DSP 
      elif b'\x00PE\x00\x00\xA3\x01' in Row: 
       Platform = 'SH3DSP' 
       break 
      # IMAGE_FILE_MACHINE_SH4   0x1a6  Hitachi SH4 
      elif b'\x00PE\x00\x00\xA6\x01' in Row: 
       Platform = 'SH4' 
       break 
      # IMAGE_FILE_MACHINE_SH5   0x1a8  Hitachi SH5 
      elif b'\x00PE\x00\x00\xA8\x01' in Row: 
       Platform = 'SH5' 
       break 
      # IMAGE_FILE_MACHINE_THUMB  0x1c2  Thumb 
      elif b'\x00PE\x00\x00\xC2\x01' in Row: 
       Platform = 'THUMB' 
       break 
      # IMAGE_FILE_MACHINE_WCEMIPSV2 0x169  MIPS little - endian WCE v2 
      elif b'\x00PE\x00\x00\x69\x01' in Row: 
       Platform = 'WCEMIPSV2' 
       break 
      else: 
       StartIndex = Row.find(b'\x00PE\x00\x00') 
       EndIndex = StartIndex + 7 
       PlatformCode = Row[StartIndex:EndIndex] 
       self.ErrorState = False 
       self.oLogger.critical('The unknown platform code is "{}".'.format(PlatformCode)) 

    assert Platform != 'UNKNOWN', 'Unknown .dll file "{}" at\n{}'.format(self.File, os.path.join(self.Root, self.File)) 

    if Platform == 'I386': 
     self.PlatformType = 'PC' 
    elif Platform in ('ARM', 'THUMB'): 
     self.PlatformType = 'PPC' 
    else: 
     self.ErrorState = False 
     self.oLogger.critical('The unknown dll file with "{}" platform code.'.format(Platform)) 
관련 문제