[
uuid(55BEB11C-FCD7-4E05-A06D-10772E368783),
version(1.0),
helpstring("Project1 Library")
]
library Project1
{
[
uuid(9CF0484D-9454-477D-BC46-D59DBB1A0444),
version(1.0),
dual,
oleautomation
]
interface IClass1: IDispatch
{
[id(0x00000001)]
HRESULT _stdcall Write([in] VARIANT vStr );
};
};
midl писал(а):C:\Distr\Visual Studio 6\VC98\BIN>"C:\Distr\Visual Studio 6\VC98\BIN\MIDL.EXE" C:\resv.txt /newtlb /tlb c:\Resv.tlb
Microsoft (R) MIDL Compiler Version 5.01.0164
Copyright (c) Microsoft Corp 1991-1997. All rights reserved.
Processing C:\resv.txt
resv.txt
Processing .\oaidl.idl
oaidl.idl
Processing .\objidl.idl
objidl.idl
Processing .\unknwn.idl
unknwn.idl
Processing .\wtypes.idl
wtypes.idl
midl\oleaut32.dll : error MIDL2020 : error generating type library : Could not add UUID, STDOLE2.TLB probably needs to be imported : IDispatch
C:\Distr\Visual Studio 6\VC98\BIN>
'интерфейс ITest
Public Property Get Result() As String
End Property
'класс ResvTest
Implements VB6Reserved
Implements ITest
Private LenTxt As Long
Private TxtBuf As String
Private LenBuf As Long
Private Sub Class_Initialize()
LenBuf = 255
LenTxt = 0
TxtBuf = Space(LenBuf)
End Sub
Private Property Get ITest_Result() As String
LenBuf = LenTxt
Result = Left$(TxtBuf, LenTxt)
End Property
Private Sub VB6Reserved_write(ByVal vStr As Variant)
Dim LenStr As Long
Dim nStr As String
nStr = CStr(vStr)
LenStr = Len(nStr)
If LenStr = 0 Then Exit Sub
If (LenTxt + LenStr) > LenBuf Then
LenBuf = (LenTxt + LenStr) * 2&
TxtBuf = TxtBuf & Space$(LenBuf)
End If
Mid$(TxtBuf, LenTxt + 1&) = nStr
LenTxt = LenTxt + LenStr
End Sub
Private Sub Command1_Click()
Dim scr As New ScriptControl
Dim d As ResvTest
On Error GoTo errh
scr.Language = IIf(Option1.Value, "javascript", "vbscript")
Set d = New ResvTest
scr.AddObject "document", d
scr.Eval Text1.Text 'document.write('test');
Exit Sub
errh:
MsgBox Err.Description, vbExclamation
End Sub
tyomitch писал(а):Тебе нужно сделать функцию, которая бы кастовала твой объект к нужному (унаследованному) интерфейсу, и из скрипта вызывать её.
NashRus писал(а):tyomitch писал(а):Тебе нужно сделать функцию, которая бы кастовала твой объект к нужному (унаследованному) интерфейсу, и из скрипта вызывать её.
Разве это не тоже самое? VB6Reserved и есть унаследованный интерфейс.Еще пробовал объявлять d1 As VB6Reserved и передавать ее в качестве "document", результат тот же.
Dim d1 As VB6Reserved
Set d = New ResvTest
Set d1 = d
scr.AddObject "document", d1
Option Explicit
Sub Main()
Dim o As Object
Set o = New Class1
o.write o.Anything
End Sub
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function VirtualProtect Lib "kernel32" (lpAddress As Any, ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long
Private Declare Function lstrcmpiW Lib "kernel32" (ByVal lpString1 As Long, ByVal lpString2 As Long) As Long
Private Const PAGE_EXECUTE_READWRITE = &H40
Public Function Anything() As String
Anything = "Mary had a little lamb"
End Function
Public Sub Write_(ByVal vStr As Variant)
MsgBox vStr
End Sub
Private Sub GetIDsOfNamesReplacement(ByVal riid As Long, rgszNames As Long, ByVal cNames As Long, ByVal lcid As Long, ByVal rgDispId As Long)
If 0 = lstrcmpiW(rgszNames, StrPtr("Write")) Then
ReDim Names(cNames) As Long
CopyMemory Names(0), rgszNames, cNames * 4
Names(0) = StrPtr("Write_")
Call GetIDsOfNamesOriginal(riid, Names(0), cNames, lcid, rgDispId)
Else
Call GetIDsOfNamesOriginal(riid, rgszNames, cNames, lcid, rgDispId)
End If
End Sub
Private Sub GetIDsOfNamesOriginal(ByVal riid As Long, rgszNames As Long, ByVal cNames As Long, ByVal lcid As Long, ByVal rgDispId As Long)
'Never called
End Sub
Private Sub Class_Initialize()
Dim pVTbl As Long, OldProtect As Long
CopyMemory pVTbl, ByVal ObjPtr(Me), 4
VirtualProtect ByVal pVTbl, 44, PAGE_EXECUTE_READWRITE, OldProtect
If OldProtect = PAGE_EXECUTE_READWRITE Then Exit Sub
CopyMemory ByVal pVTbl + 40, ByVal pVTbl + 20, 4
CopyMemory ByVal pVTbl + 20, ByVal pVTbl + 36, 4
End Sub
keks-n писал(а):Только это вроде как нарушение COM, потому как IUnknown вернётся не тот потом.
keks-n писал(а):Можно конечно создать отдельную vtable с адресами переходников, но это как-то очень извращённо.
keks-n писал(а):также надо указывать IID и размер vtable
Но я не настаиваю на использовании моего варианта, просто предложил, может, кому понадобиться...
keks-n писал(а):но это если кому надо.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7