Нельзя. 32-х битный процесс может загружать только 32-х битные dll, а 64-х битный процесс - только 64-х битные dll.Интересно, можно ли каким то образом открыть DLL'ку заточенную под x86, из под скрипта с битностью x64?
CreatoR сказал(а):OffTopic:
_dron_
Может поделишься, над чем смеёмся?
Кому то просто а кому то нет.просто
Вообще то наоборот, я же меньшее количество пихаю в большее, т.е пытаюсь надеть 64 размер обуви на ногу с 32-ым.грузить 32x битную dll в 64x битную программу это как если у тебя размер обуви 64 а ты пытаешься напялить 32 обувь
Нужен скрипт.Из обсуждения я так и не понял - нужна теория или скрипт на AutoIt?
Что и требовалось доказать.Если теория, то здесь: http://rakafon.blogspot.ru/2009/04/32-bit-dll-64-bit.html
#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)
CreatoR сказал(а):А должно?
UseX64=y говорит о том, что скрипт запускается как x64.
#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
Это не совсем ответ, это подтверждение того, что по стандарту оно не работает .Так это ж ответ на первое сообщение:
Запуск программ x32 под системой x64 происходит потому, что х64 система содержит полный набор системных dll от 32-х битной системы, они то и грузятся в 32-х битные процессы.Я почти уверен что это можно сделать, т.к в x64 уже содержится x32, доказательство этому запуск программ x32 под системой x64.