Форум сайта python.su
Привет всем.
Собираю экзешник для своего скрипта, используя py2exe.
Возникла следующая проблема:
есть у меня длл-ка, которую необходимо включить в собранный файл и использовать функции из неё, причем не распаковывая эту длл на жесткий диск. Т.е. нужно провернуть 3 действия в следующем порядке:
1. Добавить длл в exe как ресурс при сборке
2. Во время запуска exe загрузить длл из ресурсов в адресное пространство процесса и получить её handle
3. Передать полученный handle в функцию ctypes.WinDLL
Что мне удалось нарыть по каждому из “действий”:
1. Собственно это можно сделать, чем угодно. Например я сделал так:
autoitlib = open(".\AutoItX3.dll", "rb").read()
setup(
console = [{"script":"test.py", "other_resources":[(u"AUTOITX3.DLL", 1, autoitlib)]}],
)
from ctypes import *
def GetModuleHandle(filename=None):
h=windll.kernel32.GetModuleHandleW(filename)
if not h:
raise WinError()
return h
def FindResource(typersc,idrsc,c_restype=c_char,filename=None):
if type(idrsc)is int:
idrsc='#%d'%idrsc
if type(typersc) is int:
typersc='#%d'%typersc
hmod=GetModuleHandle(filename)
print(hmod)
hrsc=windll.kernel32.FindResourceW(hmod,typersc,idrsc)
if not hrsc:
raise "111:" + str(WinError())
hglobal=windll.kernel32.LoadResource(hmod,hrsc)
if not hglobal:
raise WinError()
windll.kernel32.LockResource.restype=POINTER(c_restype)
return windll.kernel32.LockResource(hglobal)[0]
if __name__ == "__main__":
libhandle = FindResource(u"AUTOITX3.DLL", 1)
AutoIt = WinDLL(u"AUTOITX3.DLL", handle = libhandle)
111:[Error 1813] The specified resource type cannot be found in the image file."
hrsc=windll.kernel32.FindResourceW(hmod,typersc,idrsc)
Отредактировано (Март 23, 2009 17:22:11)
Офлайн
Ладно, вопрос снят.
Код py2exe_util.с был найдет в SVN - http://py2exe.svn.sourceforge.net/viewvc/py2exe/tags/release_0_6_9/source/py2exe_util.c?revision=681&view=markup
Функция load_resources оттуда позволяет получить бинарные данные самой дллки либо указатель на них в памяти, но эту информацию нельзя использовать для инициализации функций из этой длл :(
Максимум что можно сделать, это сохранить полученную инфу в файл, и уже загружать его в память как длл, а чтобы загрузить длл непосредственно из ресурсов необходимо писать свой PE загрузчик, как написано здесь http://www.rsdn.ru/article/baseserv/peloader.xml
Офлайн