Функции в MSVBVM60

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Функции в MSVBVM60

Сообщение jangle » 28.12.2015 (Пн) 23:19

Где можно нарыть описание хоть части функций в рантайме? А то интересные названия попадаются:

rtcAppleScript - яблочные скрипты в VB ?

Zombie_Release - VB зомби?
Zombie_AddRef
Zombie_Invoke

rtcCreateObject2 - что делают эти функции?
TipCreateInstanceProject2
EbLoadRunTime
EbResetProjectNormal

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Функции в MSVBVM60

Сообщение Хакер » 29.12.2015 (Вт) 1:02

jangle писал(а):Где можно нарыть описание хоть части функций в рантайме?

У меня на бороде в голове.

jangle писал(а):rtcAppleScript - яблочные скрипты в VB ?

Это доступная со стороны VB функция MacScript:
vb_MacScript_01.png
vb_MacScript_01.png (3.41 Кб) Просмотров: 5779

vb_MacScript_02.png
vb_MacScript_02.png (2.76 Кб) Просмотров: 5779


Под Windows силами условной компиляции эта функция всегда генерируется так, что безусловно выкидывает ошибку 5. Очевидно, что если скомпилировать VB из исходников с другими параметрами условной компиляции (под Mac), то там будет нечто функциональное.

Это вовсе не секретная функция, на неё есть офиц. дока.


jangle писал(а):Zombie_Release - VB зомби?
Zombie_AddRef
Zombie_Invoke


В чём вопрос? Это имплементация некоторых методов IUnknown и IDispatch для VB-шных объектов. Указатели на эти функции заносятся в vtable-объекта. Причём это реализации, характерные для zombie-объектов. Что такое zombie-объекты? Это требует отдельного топика, да и мне нужно ещё раз соотнести все известные мне факты, чтобы написать правильно. Ну думаю и по названию понятно: это полуфункциональные объекты, которые нормально неюзабельны.

Например Zombie_Invoke просто возвращает HRESULT-код 0x80010007 (Вызываемая сторона (сервер [а не приложение-сервер]) недоступна и исчезла; ни одно подключение более не действует. Сам вызов, возможно, выполнен.).
В то время как BASIC_CLASS_Invoke это нормальная реализация IDispatch::Invoke, которая даёт делу законный ход.

jangle писал(а):rtcCreateObject2 - что делают эти функции?

Ну это самая обычная всем известная функция CreateObject().

EbLoadRunTime

Функция, которая делает часть работы по инициализации контексто-специфичных данных (контекст = проект × поток)

jangle писал(а):EbResetProjectNormal

Сбрасывает проект (то есть все его контексты). Сброс, это, в частности, зануление зачистка и инициализация нулями всех глобальных и статических переменных. В рантайме выполняется при старте проекта и при завершении. Да и под IDE тоже. Можно условно считать эту функцию аналогом кнопки «стоп», но с тем исключением, что и при старте она вызывается перед запуском самого кода (чтобы зачистить мусор, инициализировать нулями переменные).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Функции в MSVBVM60

Сообщение jangle » 29.12.2015 (Вт) 12:36

А что делает функция CreateIExprSrvObj? Ее используют в исходниках многопоточных приложений.

Код: Выделить всё
Private Declare Function CreateIExprSrvObj Lib "msvbvm60.dll" (ByVal p1_0 As Long, ByVal p2_4 As Long, ByVal p3_0 As Long) As Long

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Функции в MSVBVM60

Сообщение Хакер » 30.12.2015 (Ср) 12:36

jangle писал(а):А что делает функция CreateIExprSrvObj?

Создаёт COM-объект, поддерживающий интерфейс IExprSrv.

Интерфейс унаследован от IUnknown и имеет следующие методы:
IExprSrv::GetTypeLib
IExprSrv::SetOptionCompare
IExprSrv::VartypeEvaluate
IExprSrv::VariantEvaluate
IExprSrv::IsSupported
IExprSrv::VartypeFromOrdinal
IExprSrv::Invoke
IExprSrv::SetCalendar


Конструктор этого объекта вызывает RtInitProject и это частично инициализирует некоторые структуры данных, необходимые для работы нового потока. По этой причине видимо и используют (кто?), чтобы чуть улучшить ситуацию.

Сама функция CreateIExprSrvObj рантаймом никак не используется, равно как и порождаемый им COM-объект. Её оставили для каких-то внешних фишек.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Функции в MSVBVM60

Сообщение jangle » 30.12.2015 (Ср) 12:55

Хакер писал(а): По этой причине видимо и используют (кто?), чтобы чуть улучшить ситуацию.


Вот тут нашел пример ее использования:

Код: Выделить всё
Attribute VB_Name = "modMultiThreading"
'5/5/2010 base on vb multithread dll(code by izero@Slovakia)
'vb multithread without tlb,pcode,dll,ax,and so on (v1.1) by download@vbgood
'Modify by GaryNg@vbgood@4/9/2012
'From http://www.vbgood.com/thread-93124-1-1.html
Private Type mIID
    data1 As Long
    data2 As Integer
    data3 As Integer
    data4(7) As Byte
End Type

Private Declare Function CreateIExprSrvObj Lib "msvbvm60.dll" (ByVal p1_0 As Long, ByVal p2_4 As Long, ByVal p3_0 As Long) As Long
Private modnFakeHeader As Long
Private Declare Function VBGetModuleHandle Lib "kernel32.dll" Alias "GetModuleHandleA" (ByVal lpModName As Long) As Long
Private Declare Sub UserDllMain Lib "msvbvm60.dll" (u1 As Long, u2 As Long, ByVal u3_h As Long, ByVal u4_1 As Long, ByVal u5_0 As Long)
Private Declare Function VBDllGetClassObject Lib "msvbvm60.dll" (g1 As Long, g2 As Long, ByVal g3_vbHeader As Long, REFCLSID As Long, REFIID As mIID, ppv As Long) As Long
Private Declare Function CoInitialize Lib "ole32.dll" (ByVal pvReserved As Long) As Long
Private Declare Sub CoUninitialize Lib "ole32.dll" ()

Public Declare Function CreateThread Lib "kernel32" (ByVal lpSecurityAttributes As Long, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
Public Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long


Sub InitFakeHeader()
    Dim nFreeFile As Long
    Dim strMyFileName As String
    Dim bytFakeHeader() As Byte
    Dim bytVBID() As Byte
    strMyFileName = App.Path & "\" & App.EXEName & ".exe"
    nFreeFile = FileLen(strMyFileName)
    If nFreeFile > 0 Then
        ReDim bytFakeHeader(nFreeFile - 1)
        nFreeFile = FreeFile
        Open strMyFileName For Binary As nFreeFile
        Get nFreeFile, , bytFakeHeader
        Close nFreeFile
        bytVBID = StrConv("VB5!", vbFromUnicode)
        modnFakeHeader = InStrB(bytFakeHeader, bytVBID)
    End If
    'vb multithread without tlb,pcode,dll,ax,and so on (v1.1) by download@vbgood
    'this sub should be call only once at app start.
End Sub

Sub InitVBdll()
    Dim pIID As mIID
    Dim pDummy As Long
    pIID.data1 = 1
    pIID.data4(0) = &HC0
    pIID.data4(7) = &H46
    Dim u1 As Long, u2 As Long, u3 As Long
    Dim g3 As Long
    u3 = VBGetModuleHandle(0)
    Dim pVBHeader As Long
    UserDllMain u1, u2, u3, 1, 0
    If modnFakeHeader > 0 Then
        g3 = u3 + modnFakeHeader - 1
        VBDllGetClassObject u1, u2, g3, pDummy, pIID, pDummy
    End If
End Sub

Public Sub Thread1()
    Dim hr As Long
    CreateIExprSrvObj 0, 4, 0
    hr = CoInitialize(0)
    Call InitVBdll
    Call Form2.XXX
    Call CoUninitialize
   
End Sub


Public Sub Thread2()
    Dim hr As Long
    CreateIExprSrvObj 0, 4, 0
    hr = CoInitialize(0)
    Call InitVBdll
    Call Form2.XXXX
    Call CoUninitialize
   
End Sub

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Функции в MSVBVM60

Сообщение Adam Smith » 01.01.2016 (Пт) 17:56

Хм, классный модуль)) Будет валиться если для передачи использовать шаредмэмори?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Функции в MSVBVM60

Сообщение Хакер » 03.01.2016 (Вс) 14:09

Adam Smith писал(а):Хм, классный модуль)) Будет валиться если для передачи использовать шаредмэмори?

Тебе не кажется, что куда уместнее спросить, какими ограничениями обладает этот метод?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Функции в MSVBVM60

Сообщение Adam Smith » 03.01.2016 (Вс) 15:36

Мне кажется эффективнее провести десяток экспериментов по описанным в статьях кейсам.
Ответы будут однозначные и гораздо быстрее.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Функции в MSVBVM60

Сообщение Хакер » 03.01.2016 (Вс) 15:46

Эффективнее чем что? Эффективнее, чем спросить здесь?

Тогда давай сыграем в игру. Я притворюсь дурачком и спрошу у тебя: какими ограничениями обладает этот метод?
Ты, чтобы ответить мне на вопрос, проведёшь десяток экспериментов по описанным в статьях кейсам. А затем дашь ответ. С учётом того, что я на самом деле знаю правильный ответ на свой вопрос, можно будет сказать, эффективнее ли твоя методика, чем спрашивание здесь.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Функции в MSVBVM60

Сообщение Adam Smith » 03.01.2016 (Вс) 15:53

Зачем мне это? Если цель озвучена настоящая, то уже есть тема, которую можно почитать и оценить все качества ответов.
Это не единственная моя тема на этом форуме, были и другие, о которых я через пару лет забыл и снова возвращаюсь сюда.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Функции в MSVBVM60

Сообщение Хакер » 03.01.2016 (Вс) 15:55

Опять эти хитровымудренные обороты, из которых ничерта не ясно.

Зачем играть в мою игру — ответ прост. Затем, что мне кажется, что твоя методика оценки ограничений данного подхода не выдаст ограничений и ты введёшь себя в счастливое заблуждение, что вот мол она — безлимитная многопоточность.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Функции в MSVBVM60

Сообщение Adam Smith » 03.01.2016 (Вс) 16:20

Ладно, оффтоплю тут в последний раз. Зачем мне играть в игру, у которой я уверен, есть ещё цели, которых я не преследую.
Мне уже довелось написать программку на VB6, в которой не смотря на то, что мой код не вызывал краха, он мог самопроизвольно произойти.
Так я её и не переписал и посеял со временем. Но вообще, из твоих тем и отдельных комментариев я понял ещё одну немаловажную вещь.
Попеременно добавляя или убирая слово безлимитная можно говорить о многопоточности и как возможной, и как о невозможной в VB6.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Функции в MSVBVM60

Сообщение Хакер » 03.01.2016 (Вс) 16:22

Надоел ты мне своей труднопроходимостью. Делай что хочешь.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Функции в MSVBVM60

Сообщение Adam Smith » 03.01.2016 (Вс) 16:24

Многопоточность налагает ограничения на код, а значит безлимитной она вообще не бывает. К чему тут эта дискуссия.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Функции в MSVBVM60

Сообщение Хакер » 03.01.2016 (Вс) 16:26

Ограничения на код, вызванные параллелизмом. Это одно.

А совершенно другая сторона вопроса — это то, что подобный трюк инициализирует не всё, что необходимо для стабильной работы рядового VB-кода, а только часть необходимого. А значит обычный ничем не примечательный код, никак не взаимодействующий с другими потоками, никак не завязанный на параллельное выполнение, может вызвать креш при работе в отдельном потоке.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Функции в MSVBVM60

Сообщение The trick » 24.03.2016 (Чт) 15:02

Тот модуль имеет еще один недочет, кроме того о котором говорил Хакер (ограничения). Этот код загружает проект из оригинального VBHeader, поэтому он начинает выполняться со стартового объекта проекта. К примеру если стартовый объект будет форма, то она появится на мгновение и весь соответствующий код будет выполняться, если будет Sub Main процедура, то она будет вызываться также. Но комбинируя этот метод с моим можно избавиться от TLB я думаю.
UA6527P


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 55

    TopList