Суть такова. Есть функция в широко извесной длл'ки, которая в качестве аргумента принимает структуру...к примеру:
- Код: Выделить всё
Private Type RAROpenArchiveData
ArcName As String
OpenMode As Long
OpenResult As Long
CmtBuf As String
CmtBufSize As Long
CmtSize As Long
CmtState As Long
End Type
Public Declare Function RAROpenArchive Lib "unrar.dll" (ByRef ArchiveData As RAROpenArchiveData) As Long
Но у меня данная длл'ка загружена уже в памяти, и не совсем традиционным способом. И чё-та я вошел в тупик, никак не могу передать ей структуру.
В общем, создал некий враппер для функции, но проблему не могу решить.
Входящий адрес функции в памяти передается через pProc...
Вариант первый похоже как-то обрабатывает структуру, так как в OpenResult содержится код ошибки, отличный от первоначального нулевого значения (GetMem4 принимает входящие как Any):
- Код: Выделить всё
Private Const ASM_PUSH As Byte = &H68 'PUSH ...
Private Const ASM_CALL As Byte = &HE8 'CALL ...
Private Const ASM_RETN10 = &H10C2& 'RETN 10
Private Function CallWinowProc4(ByVal pProc As Long, ByRef ArchiveData As RAROpenArchiveData) As Long
Dim Proc(13) As Byte 'Буфер для варианта процедуры CallWinowProc@4
Dim lngAddr As Long
Dim lngOffset As Long
lngAddr = VarPtr(Proc(0))
lngOffset = lngAddr
PutMem1 lngOffset, ASM_PUSH 'PUSH ...
lngOffset = lngOffset + 1
GetMem4 VarPtr(ArchiveData), ByVal lngOffset 'Arg
lngOffset = lngOffset + 4
PutMem1 lngOffset, ASM_CALL 'CALL ...
lngOffset = lngOffset + 1
PutMem4 lngOffset, pProc - lngOffset - 4 'pProc
lngOffset = lngOffset + 4
PutMem4 lngOffset, ASM_RETN10 'RETN 10
CallWinowProc4 = CallWindowProc(lngAddr, 0, 0, 0, 0)
End Function
Вариант второй вообще вылетает с ошибкой на невозможность писать в память по левому адресу, и соответственно схлопывается:
- Код: Выделить всё
Private Function CallWinowProc28(ByVal pProc As Long, ByRef ArchiveData As RAROpenArchiveData) As Long
Dim Proc(43) As Byte 'Буфер для варианта процедуры CallWinowProc@28
Dim lngAddr As Long
Dim lngOffset As Long
lngAddr = VarPtr(Proc(0))
lngOffset = lngAddr
PutMem1 lngOffset, ASM_PUSH 'PUSH ...
lngOffset = lngOffset + 1
GetMem4 VarPtr(ArchiveData.CmtState), ByVal lngOffset 'Arg7
lngOffset = lngOffset + 4
PutMem1 lngOffset, ASM_PUSH 'PUSH ...
lngOffset = lngOffset + 1
GetMem4 VarPtr(ArchiveData.CmtSize), ByVal lngOffset 'Arg6
lngOffset = lngOffset + 4
PutMem1 lngOffset, ASM_PUSH 'PUSH ...
lngOffset = lngOffset + 1
GetMem4 VarPtr(ArchiveData.CmtBufSize), ByVal lngOffset 'Arg5
lngOffset = lngOffset + 4
PutMem1 lngOffset, ASM_PUSH 'PUSH ...
lngOffset = lngOffset + 1
GetMem4 VarPtr(ArchiveData.CmtBuf), ByVal lngOffset 'Arg4
lngOffset = lngOffset + 4
PutMem1 lngOffset, ASM_PUSH 'PUSH ...
lngOffset = lngOffset + 1
GetMem4 VarPtr(ArchiveData.OpenResult), ByVal lngOffset 'Arg3
lngOffset = lngOffset + 4
PutMem1 lngOffset, ASM_PUSH 'PUSH ...
lngOffset = lngOffset + 1
GetMem4 VarPtr(ArchiveData.OpenMode), ByVal lngOffset 'Arg2
lngOffset = lngOffset + 4
PutMem1 lngOffset, ASM_PUSH 'PUSH ...
lngOffset = lngOffset + 1
GetMem4 VarPtr(ArchiveData.ArcName), ByVal lngOffset 'Arg1
lngOffset = lngOffset + 4
PutMem1 lngOffset, ASM_CALL 'CALL ...
lngOffset = lngOffset + 1
PutMem4 lngOffset, pProc - lngOffset - 4 'pProc
lngOffset = lngOffset + 4
PutMem4 lngOffset, ASM_RETN10 'RETN 10
CallWinowProc28 = CallWindowProc(lngAddr, 0, 0, 0, 0)
End Function
Кто-нибудь может подскажет, где я туплю? Как мне передать эту структуру?