Что нового

Возможно ли открытие DLL'ки x86 из скрипта x64?

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Интересно, можно ли каким то образом открыть DLL'ку заточенную под x86, из под скрипта с битностью x64? :scratch:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
OffTopic:
_dron_
Может поделишься, над чем смеёмся?
 

asdf8

Скриптер
Сообщения
564
Репутация
152
CreatoR [?]
Интересно, можно ли каким то образом открыть DLL'ку заточенную под x86, из под скрипта с битностью x64?
Нельзя. 32-х битный процесс может загружать только 32-х битные dll, а 64-х битный процесс - только 64-х битные dll.
 

_dron_

Знающий
Сообщения
84
Репутация
8
CreatoR сказал(а):
OffTopic:
_dron_
Может поделишься, над чем смеёмся?
OffTopic:

Лол... просто грузить 32x битную dll в 64x битную программу это как если у тебя размер обуви 64 а ты пытаешься напялить 32 обувь порвешь но ходить точно не сможешь ;D (хотя в теории все возможно)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
_dron_ [?]
Кому то просто а кому то нет.
Тебе будет приятно если кто то будет высмеивать тебя публично, по теме в которой ты не разбираешься? а таких есть немало...
Как минимум, твоё поведение неуважительно.
Ладно проехали...

грузить 32x битную dll в 64x битную программу это как если у тебя размер обуви 64 а ты пытаешься напялить 32 обувь
Вообще то наоборот, я же меньшее количество пихаю в большее, т.е пытаюсь надеть 64 размер обуви на ногу с 32-ым.
Аналогия неудачная.

Я почти уверен что это можно сделать, т.к в x64 уже содержится x32, доказательство этому запуск программ x32 под системой x64.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Из обсуждения я так и не понял - нужна теория или скрипт на AutoIt?
Если теория, то здесь: http://rakafon.blogspot.ru/2009/04/32-bit-dll-64-bit.html
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
InnI [?]
Из обсуждения я так и не понял - нужна теория или скрипт на AutoIt?
Нужен скрипт.

Что и требовалось доказать.
Спасибо.

Я в принципе мог бы извлекать 32-битную версию скрипта, далее открывать из под неё 32-битную DLL, и передавать данные в родительский скрипт, но это не идеальный вариант...
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
CreatoR

В архиве - dll 32-бит

Код:
#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseX64=y
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****

Global $dllname = @ScriptDir & '\fgh.dll'
Global $dll = DllOpen($dllname)

DllCall($dll, 'int:cdecl', '_sText', 'str', "Привет!")
ConsoleWrite(@error & @LF)

Не работает
 

Вложения

  • fgh.zip
    5.1 КБ · Просмотры: 6

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
CreatoR сказал(а):
А должно?
UseX64=y говорит о том, что скрипт запускается как x64.

Так это ж ответ на первое сообщение:
dll-32 бит
скрипт 32-бит - работает
скрипт 64-бит - не работает
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вот что я имел в виду:

Код:
#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseX64=y
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****

#pragma compile(AutoItExecuteAllowed, true)

#include <Constants.au3>

Global $dllname = @ScriptDir & '\fgh.dll'

$iRet = _DllCallx86($dllname, 'int:cdecl', '_sText', 'str', 'Привет!')
ConsoleWrite($iRet & @LF)

Func _DllCallx86($sDLL, $iRet, $sFunc, $vType1 = '', $vParam1 = '', $vType2 = '', $vParam2 = '')
	If Not @AutoItX64 Then
		Return DllCall($sDLL, $iRet, $sFunc, $vType1, $vParam1, $vType2, $vParam2)
	EndIf
	
	Switch @NumParams
		Case 3
			$sLine = '"ConsoleWrite(DllCall(''' & $sDLL & ''', ''' & $iRet & ''', ''' & $sFunc & ''')[0])"'
		Case 4, 5
			$sLine = '"ConsoleWrite(DllCall(''' & $sDLL & ''', ''' & $iRet & ''', ''' & $sFunc & ''', ''' & $vType1 & ''', ''' & $vParam1 & ''')[0])"'
		Case 6, 7
			$sLine = '"ConsoleWrite(DllCall(''' & $sDLL & ''', ''' & $iRet & ''', ''' & $sFunc & ''', ''' & $vType1 & ''', ''' & $vParam1 & ''', ''' & $vType2 & ''', ''' & $vParam2 & ''')[0])"'
	EndSwitch
	
	If @Compiled Then
		FileInstall('MyScript64.exe', @ScriptDir & '\MyScript64.exe', 1)
		$iPID = Run('"' & @ScriptDir & '\MyScript64.exe' & '" /AutoIt3ExecuteLine ' & $sLine, '', @SW_SHOWNORMAL, $STDOUT_CHILD)
	Else
		$iPID = Run('"' & StringReplace(@AutoItExe, '_x64.exe', '.exe') & '" /AutoIt3ExecuteLine ' & $sLine, '', @SW_SHOWNORMAL, $STDOUT_CHILD)
	EndIf
	
	ProcessWaitClose($iPID)
	Local $sRet = StdoutRead($iPID)
	
	If @Compiled Then
		FileDelete(@ScriptDir & '\MyScript64.exe')
	EndIf
	
	Return $sRet
EndFunc
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
WSWR [?]
Так это ж ответ на первое сообщение:
Это не совсем ответ, это подтверждение того, что по стандарту оно не работает :smile:.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
CreatoR [?]
Я почти уверен что это можно сделать, т.к в x64 уже содержится x32, доказательство этому запуск программ x32 под системой x64.
Запуск программ x32 под системой x64 происходит потому, что х64 система содержит полный набор системных dll от 32-х битной системы, они то и грузятся в 32-х битные процессы.
 
Верх