Вот что выдал VB Decompiler: Вот код который я разреверсил: Код (Text): ' Decompiled by The trick 2015 Option Explicit Private Sub Command1_Click() Dim ebp64() As Long Dim ebp44 As Long Dim ebp30 As Long Dim ebp60() As Variant Dim ebp104 As Long Dim ebp24 As Long Dim ebp2c As Long Dim ebp28 As Long Dim ebp108 As Long Dim ebp40 As Variant Dim ebp4c As Long ebp44 = proc_710(ebp64()) ebp30 = CLng(CDbl(Text3.Text)) List1.Clear Label2.Visible = True txtRes.Text = vbNullString txtRes1.Text = vbNullString Command1.Enabled = False DoEvents ReDim ebp60(1 To 1) For ebp24 = 1 To ebp44 For ebp28 = 1 To ebp64(ebp24, 2) ebp2c = ebp2c + 1 ReDim Preserve ebp60(1 To ebp2c) ebp60(ebp2c) = ebp64(ebp24, 1) Next Next Dim ebp5c As String Dim ebp54 As String Dim ebp114 As Long Dim ebp110 As Long Dim ebpa8 As Variant Dim ebp50 As Long Dim ebp184 As Double Dim ebp48 As Long Dim ebp58 As Long Dim ebpec As Long Dim ebpd0 As Boolean ' LOOP_1 Do ebp5c = vbNullString ebp50 = 0 Call proc_704(ebp60, ebp2c) ebp40 = LongSumEl(ebp60, ebp30, ebp4c) ' CONDITION_VARTYPE If VarType(ebp40) = (vbArray Or vbLong) Then ' FOR_1 For ebp24 = LBound(ebp40) To UBound(ebp40) ' CONDITION_EBP40 If ebp40(ebp24) <> 0 Then ebp5c = ebp5c & ebpa8 & ebp40(ebp24) & " " ebp50 = CLng(ebp40(ebp24) + ebp50) ' FOR_2 For ebp28 = 1 To ebp2c ' CONDITION_EQUALS If ebp60(ebp28) = ebp40(ebp24) Then ebp40(ebp24) = 0 ebp60(ebp28) = 0 End If Next End If Next Label2.Caption = CStr(Val(CStr(ebp2c / 100))) DoEvents If ebp50 = 0 Then Exit Do ebp54 = ebp54 & (ebp48 + 1) & "." & Chr$(9) & ebp5c & " Отходы " & CStr(ebp30 - ebp50) & vbNewLine ebp58 = ebp58 + (ebp30 - ebp50) ebp48 = ebp48 + 1 Else ebpec = proc_708(ebp60, ebp2c) ' CONDITION_EBPEC If ebpec < ebp30 And ebp40 <> ebp30 Then ' FOR_3 For ebp28 = 1 To ebp2c ' CONDITION_EBP60_NE If ebp60(ebp28) <> 0 Then ebp5c = ebp60(ebp28) & " " & ebp5c ebp60(ebp28) = 0 End If Next ebp54 = ebp54 & CStr(ebp48 + 1) & "." & Chr$(9) & ebp5c & " Отходы " & ebp40 & vbNewLine ebp58 = ebp58 + Val(CStr(ebp40)) ebp48 = ebp48 + 1 Exit Do End If ebpec = proc_70c(ebp64(), ebp44) If ebp4c > ebpec Then Exit Do ebp4c = ebp4c + 5 End If Loop On Error Resume Next List1.AddItem " " List1.AddItem "Всего потребуется досок " & ebp48 List1.AddItem "Отходы (всего ) " & ebp58 ' !!!!!!!!!!!!! Check ebpa8 ebpa8 = Round(ebp58 / ebp30, 2) List1.AddItem "Отходы (доски, шт) " & ebpa8 ebpa8 = Round(ebp58 / ebp30 / ebp48 * 100, 2) List1.AddItem "Отходы (всего, %) " & ebpa8 txtRes.Text = ebp54 Label2.Visible = False Command1.Enabled = True DoEvents txtRes1.Text = proc_700(ebp54) End Sub Private Function proc_700(v1 As String) As String Dim ebp24 As Long Dim ebp34 As Variant Dim ebp38 As String Dim ebp18 As Long Dim ebp20 As Long ebp34 = Split(v1, vbNewLine) ebp24 = UBound(ebp34) ebp38 = Split(ebp34(0), Chr$(9))(1) ebp20 = 1 ' FOR_EBP18 For ebp18 = 1 To ebp24 ' CONDITION_EBP18 If ebp34(ebp18) <> vbNullString Then ' CONDITION_SPLIT If Split(ebp34(ebp18), Chr$(9))(1) = ebp38 Then ebp20 = ebp20 + 1 Else proc_700 = proc_700 & CStr(ebp20) & " раз " & Chr$(9) & ebp38 & vbNewLine ebp20 = 1 If ebp34(ebp18) <> vbNullString Then ebp38 = Split(ebp34(ebp18), Chr$(9))(1) End If End If End If Next proc_700 = proc_700 & CStr(ebp20) & " раз " & Chr$(9) & ebp38 & vbNewLine End Function Private Function proc_70c(v() As Long, v1 As Variant) As Long Dim edi As Long proc_70c = v(1, 1) If v1 < 1 Then Exit Function For edi = 1 To v1 If v(edi, 1) > proc_70c Then If v(edi, 2) > 0 Then proc_70c = v(edi, 1) End If End If Next End Function Private Function proc_708(v() As Variant, v1 As Long) As Long Dim edi As Long For edi = 1 To v1 proc_708 = proc_708 + v(edi) Next End Function Public Function LongSumEl(v() As Variant, v1 As Long, v2 As Long) As Variant Dim ebp40() As Long Dim ebp44() As Long Dim esi As Long Dim ebp7c As Long Dim ebp18 As Long Dim ebp1c As Long Dim ebp34 As Long Dim ebp38 As Long Dim edi As Long ebp34 = v1 - v2 If v1 > 80000000 Or v1 < 0 Then Exit Function ReDim ebp40(v1) For esi = 1 To v1 ebp40(esi) = -1 Next ebp7c = UBound(v(), 1) For ebp18 = 1 To ebp7c ebp1c = v1 - v(ebp18) Do While ebp1c >= 0 If ebp40(ebp1c) >= 0 Then edi = v(ebp18) + ebp1c If ebp40(edi) = -1 Then ebp40(edi) = ebp1c If edi >= ebp34 Then Do ebp38 = ebp38 + 1 ReDim Preserve ebp44(1 To ebp38) ebp44(ebp38) = edi - ebp40(edi) edi = ebp40(edi) Loop While edi LongSumEl = ebp44() Exit Function End If End If ebp1c = ebp1c - 1 Loop Next edi = v1 Do While edi >= 1 If ebp40(edi) >= 0 Then Exit Do edi = edi - 1 Loop LongSumEl = v1 - edi End Function Private Sub proc_704(v As Variant, l As Long) ' +704 Dim ebp1c() As Variant Dim ebp14 As Long Dim esi As Long ReDim ebp1c(1 To 1) For ebp14 = 1 To l If v(ebp14) <> 0 Then esi = esi + 1 ReDim Preserve ebp1c(1 To esi) ebp1c(esi) = v(ebp14) End If Next v = ebp1c() l = esi End Sub Private Function proc_710(arr() As Long) As Long Dim i As Integer ReDim arr(1 To 5, 1 To 2) For i = 0 To 4 arr(i + 1, 1) = CLng(CDbl(Text1(i).Text)) arr(i + 1, 2) = CLng(CDbl(Text2(i).Text)) Next proc_710 = 5 End Function Вот оригинальный код: Код (Text): Option Explicit Private Type typeBrd LenB As Long CntB As Long End Type Private Sub Command1_Click() Dim arr(), res, ArrB() As typeBrd, k As Long, dL As Long, t0 As Long, tL As Long, st As String Dim n As Long, i As Long, j As Long, LB As Long, sum As Long, s As String ', x As Long Call GetData(ArrB(), n) LB = Val(Text3.Text): List1.Clear: Label2.Visible = True: txtRes.Text = "": txtRes1.Text = "": Command1.Enabled = False: DoEvents ReDim arr(1 To 1) For i = 1 To n For j = 1 To ArrB(i).CntB k = k + 1 ReDim Preserve arr(1 To k): arr(k) = ArrB(i).LenB ' Переписываем длины в одномерный массив чтобы скормить функции Next j Next i m: Do sum = 0: s = "" Call compRes(arr, k) res = LongSumEl(arr(), LB, dL) If VarType(res) = 8195 Then 'Если функция вернула массив, то For i = LBound(res) To UBound(res) If res(i) <> 0 Then s = s & res(i) & " ": sum = sum + res(i) For j = 1 To k 'Убираем из массива использованные элементы If res(i) = arr(j) Then res(i) = 0: arr(j) = 0 ' Next j End If Next i Label2.Caption = Val(k / 100): DoEvents If sum = 0 Then GoTo m1 st = st & tL + 1 & "." & vbTab & s & " Отходы " & LB - sum & vbCrLf t0 = t0 + (LB - sum): tL = tL + 1 Else If sumRes(arr, k) < LB And res <> LB Then For j = 1 To k If arr(j) <> 0 Then s = s & arr(j) & " ": arr(j) = 0 Next j st = st & tL + 1 & "." & vbTab & s & " Отходы " & res & vbCrLf t0 = t0 + Val(res): tL = tL + 1 GoTo m1 End If Exit Do End If Loop If dL <= maxL(ArrB(), n) Then dL = dL + 5: GoTo m m1: 'Вывод результата On Error Resume Next List1.AddItem " " List1.AddItem "Всего потребуется досок " & tL List1.AddItem "Отходы (всего ) " & t0 List1.AddItem "Отходы (доски, шт) " & Round(t0 / LB, 2) List1.AddItem "Отходы (всего, %) " & Round(((t0 / LB) / tL) * 100, 2) txtRes.Text = st Label2.Visible = False: Command1.Enabled = True: DoEvents txtRes1.Text = compStr(st) 'MsgBox "Всего потребуется досок " & tL & vbCrLf & "Отходы (всего, м) " & t0 & _ vbCrLf & "Отходы (доски, шт) " & Round(t0 / LB, 2) & _ vbCrLf & "Отходы (всего, %) " & Round(((t0 / LB) / tL) * 100, 2) End Sub Private Function compStr(s As String) As String Dim st, i As Long, j As Long, n As Long, tmp1 As String, tmp2 As String, k As Long st = Split(s, vbCrLf): n = UBound(st) tmp1 = Split(st(0), vbTab)(1) k = 1 For i = 1 To n If st(i) <> "" Then tmp2 = Split(st(i), vbTab)(1) If tmp1 = tmp2 Then k = k + 1 Else compStr = compStr & k & " раз " & vbTab & tmp1 & vbCrLf k = 1 If st(i) <> "" Then tmp1 = Split(st(i), vbTab)(1) End If End If Next i compStr = compStr & k & " раз " & vbTab & tmp1 & vbCrLf End Function Private Sub compRes(res, n As Long) Dim a() As Variant, i As Long, k As Long ReDim a(1 To 1) For i = 1 To n If res(i) <> 0 Then k = k + 1: ReDim Preserve a(1 To k): a(k) = res(i) Next i res = a: n = k End Sub Private Function sumRes(a(), n As Long) As Long Dim i As Long For i = 1 To n sumRes = sumRes + a(i) Next i End Function Private Function maxL(ArrB() As typeBrd, n) As Long Dim i As Long: maxL = ArrB(1).LenB For i = 1 To n If ArrB(i).LenB > maxL And ArrB(i).CntB > 0 Then maxL = ArrB(i).LenB Next i End Function Private Sub GetData(ArrB() As typeBrd, n As Long) n = 5 ReDim ArrB(1 To n) Dim i As Long For i = 1 To n ArrB(i).LenB = Val(Text1(i - 1).Text) ArrB(i).CntB = Val(Text2(i - 1).Text) Next i End Sub 'Функция не моя(не SoftIce), нашел на просторах интернета Function LongSumEl(arr(), sm As Long, Optional ds As Long = 0) Dim out&(), i&, j&, k&, n&, L&, sm1& n = sm ' + ds 'вот здесь я поправил sm1 = sm - ds If n > 80000000 Or n < 0 Then Exit Function ReDim a&(n) For i = 1 To n: a(i) = -1: Next i For i = 1 To UBound(arr) For j = n - arr(i) To 0 Step -1 If a(j) >= 0 Then k = j + arr(i) If a(k) = -1 Then a(k) = j If k >= sm1 Then Do L = L + 1 ReDim Preserve out&(1 To L) out(L) = k - a(k) k = a(k) Loop While k LongSumEl = out Exit Function End If End If Next j, i For i = sm To 1 Step -1 If a(i) >= 0 Then Exit For Next i LongSumEl = sm - i End Function
Ну вроде да, это был именно vb decompiler, отношения с которым у меня не сложились. Скриншот не затащился, видимо по той же причине, по которой я не смог его посмотреть на сайте.
Вот именно, что многопоточность не поддерживается, про сабклассинг - я писал выше (ActiveX) это не то. Да, есть стандартные PE-лоадеры - типа крипты даже на нём, но при чём тут многопоточность и вызов API через Declare? Да и с _cdecl проблем нет, никто LoadLibrary не отменял. P.S: А нафига вообще этот паровоз, когда давно уже электропоезда изобрели и даже на магнитной подушке
Я вообще тебя не понял. Многопоточность поддерживается. Что это тогда по-твоему: ? Ты вообще о чем? Ты похоже один из тех программеров кто не осилил его. В общем если хочешь какие-либо свои мысли изложить по этому поводу, или пруфы многопоточности и т.п. создай отдельный топик в специальном разделе. Я тебе с удовольствием предоставлю все что тебе необходимо, возможно ты изменишь свой взгляд на этот продукт. Я не хочу эту тему здесь развивать. Ок?
Про "поезда и паровозы объяснюсь": VB6 хорош тем что реально на коленке без всяких зависимостей можно сделать гуй, если нет под рукой наработок и нет времени, для экстремального программирования гуев - только в путь, в то же время он не обеспечивает необходимой скорости других задач. Можно при желании прицепить 1 кликом ocx всякие с красивостями и потом все это той же IDE вхреначить в инсталлятор, причем быстро и не дорого соответственно. Но на нём писать, используя какие то приблуды типа инлайн асмов - это для заказчиков - лохов наверное, но никак не профиты, это изврат. --- Сообщение объединено, 28 фев 2021 --- Thetrik, я тебе и говорил что сабклассинг ActiveX и прочее, попробуй exe замутить на нём многопоточный.......... ADD: и глянь чтоб не было вылетов и сколько реально потоков создается, тем же ProcessHacker или ProcessExplorer. msvbvm60 априори однопоточка. Решалось когда то тупо через Fiber'ы, конечные автоматы или события, имхо как не крути, но многопоточку exe обычный ты не замутишь на VB6/
Если ты про скорость в плане разработки софта, то да, современные среды и ЯП позволяют создавать приложения быстрее (в плане скорости разработки) и с большими возможностями типа кросплатформенности и т.п. Если в плане скорости работы кода, то тут не все так просто. Также, насколько мне известно, ни одна среда не обеспечивает такой тесной интеграции с COM/ActiveX как VB6. Насчет RAD'ности я тоже ничего не могу сказать т.к. не обладаю достаточными знаниями в области других сред разработки. К примеру в VB6 можно запустить ActiveX сервер, из любого другого EXE дернуть метод, поставить на паузу и писать код метода непосредственно в этот момент (когда EXE ожидает ответа). Насколько мне известно ни одна IDE/ЯП так не могут (могу ошибаться). Никто не заставляет тебя так делать. Использование инлайн асма в С/C++ - изврат? Ты приводишь мне асм и низкоуровневый кодинг как какой-то аргумент против VB6. Я тебе говорю что есть такая возможность и в VB6 и тут ты мне пишешь про лохов. В чем дело? Давай сначала разберемся чем ActiveX EXE не угодил? Написать я могу почти любой код на VB6.
https://wasm.in/threads/mnogopotochnost-na-vb6.31758/ Thetrik, крутой раздел, спасибо вам большое...))) Что-то не видел, начал читать с удовольствием, я не фанат бейсика, но прикольные там темы, мне понравилось, куча инфы, может мне даже пригодится...)))
Ага, то-то там каждый "чих" огорожен критическими секциями. Не нужно тут дезинформации. Рантайм написан исключительно с поддержкой многопоточности. Как минимум OCX и DLL создаваемые в VB6 могут быть использованы из многопоточных хостов.
в том то и дело, что нативные API по созданию потоков там не канают. Поэтому и "чихает". И спрашивается нафиг паровоз? Что на нём кроме окошек писать (гуев)? Мож малварь? Еще раз попрошу в подтверждение своих слов - дайте норм рабочий семпл обычного exe с поддержкой CreateThread, не говоря о уже о RtlCreateUserThread? Да, я согласен удобно и знать не надо систему, но всё же нафига? Чисто школьников учить у которых нет наработок например на чистом API на сях, делфи или прочего? ADD: ActiveX 96 года - давно анахронизм. Уж если делать нефиг - перейдите на .NET чтоль....
Спасибо за отзыв. Есть еще несколько новых проектов, думаю опубликовать тут или не стоит, т.к. многим не по душе здесь это. И что? Я конкретно задал вопрос - чем не устраивает ActiveX EXE? Или ты (давай на "ты") один из тех кто сам не понимает зачем он хочет потоки, но не хочет ActiveX EXE? Я сделаю семпл с CreateThread, если ты создашь специальный топик и нормально сформулируешь задачу. Поток ради потока? Для того что так работает система, а именно COM, а именно STA апартамент. Второй момент это то что VB6 абстрагирует тебя от необходимости в синхронизации и изоляции межпоточных данных. Ок, не хочешь, не используй эту фичу. Можешь создавать потоки через CreateThread, как в C, но и ответственности у тебя будет как в C. Ага, то-то весь офис поголовно ActiveX сервера. В винде куча новых технологий основана на COM. Не нужно тут писать дезу.
Имхо, если бы аверы так рубили с плеча, как rmn и f13nd в этой ветке, то мир остался бы без метапрограммирования.
я использовал морф для оптимазы алгоса по скорости. Но в большинстве случаев лучше использовать указатели на функи. для защиты от реверса морф тоже лишний == он гораздо больше делает ПАЛЕВА, чем пользы. тч я лично не знаю, где морф реально нужен в обычном софте.. те же нейронки можно делать на функо-указателях.