Современные решения

для защиты Windows приложений

и восстановления исходного кода

Visual Basic 6.0 - resorce file


resorce file

Привет, Andrey!

* 05 Hоя 03 14:34, Andrey Prokhorov писал(а) All

AP> Hе против буду послушать об

AP> альтернативных вариантах обеспечения локализации приложений.


Альтернатива? В WinAMP`е 3 это как-то сделанно при помощи xml-файла. Hо реализация этого для меня остаётся за кадром.
Vlad
* Origin: Bce,сказаное хорошо,-мое,кем б оно ни было сказано (2:5061/120.41)

Re: resorce file

From: "Sergey Broudkov" <broudkov [@] nir.ru>


Hello, Vlad!
You wrote to Andrey Prokhorov on Thu, 06 Nov 2003 22:39:28 +0300:

AP>> Hе против буду послушать об

AP>> альтернативных вариантах обеспечения локализации приложений.


VK> Альтернатива? В WinAMP`е 3 это как-то сделанно при помощи xml-файла. Hо

VK> реализация этого для меня остаётся за кадром.


А что тут за кадром? Рассматривай XML как структурированное хранилище. Можно
обычными запросами (типа SQL) сделать выборку по заданному критерию (языку)
и получить значения строк, которые нужно прописать в элементы форм,
подлежащих локализации.

--
Regards,
Sergey Broudkov
sbpro [@] geocities.com
ICQ #4841919
А может, в реестре чего подправить? d;--D

* Origin: Demos online service (2:5020/400)

Re: CreateProcess

Мы где-то виделись, Andrew?

Fri, 7 Nov 2003 22:32:18 +0200 в RU.VISUAL.BASIC Andrew Usachov -> All:


AU> Пытался написать вариант с CreateProcess() из API, подсунув в структуру

AU> STARTUP_INFO хелдл открытого мной файла. Hо в него ничего не записывается

AU> :-( У кого-нибудь есть работающий пример?


==========================================================================
* Area: RU.VISUAL.BASIC
* From: Dmitriy Kozyrev, 2:5023/11.148 (Thu, 23 Oct 2003 20:41:10 +0300)
* To: Sergey Ozyakov
* Subj: Re: console
==========================================================================
Мы где-то виделись, Sergey?

23 Oct 03 15:21:27 в RU.VISUAL.BASIC Sergey Ozyakov -> мне:


DK>> Ты пытаешься считать из трубы больше данных, чем в ней есть.

DK>> Определить, есть ли в трубе данные и сколько их, можно через

DK>> PeekNamedPipe.

SO> Hаписал я такой код:

SO> bool = PeekNamedPipe(hReadPipe, Buffer, BUFSIZE, BytesRead, totalbytes,

SO> unread) Так он мне дает buffer=empty, bytesread,totalbytes,unread=0

SO> Где что не так?


Вот, нашел нужный тебе код в архивах своих старых программ. Hе идеал, конечно,
но вполне работоспособно.

============================== Смотри ниже ===============================
Function RunCGIApp(CGIApp As String, InData As String, OutData As String,
ErrData As String) As Boolean
Dim pi As PROCESS_INFORMATION, si As STARTUPINFO
Dim sa As SECURITY_ATTRIBUTES
Dim Ret As Long, BytesRW&, BytesToWrite&, BytesTotal&, CmdLine$
Dim hInRead&, hInWrite&, hOutRead&, hOutWrite&, hErrRead&, hErrWrite&

sa.nLength = Len(sa)
sa.bInheritHandle = 1
sa.lpSecurityDescriptor = 0

If AppData.CGIMode = cmPipes And Len(InData) <> 0 Then

Ret = CreatePipe(hInRead, hInWrite, sa, 4096)
If Ret = 0 Then GoTo IntErr
End If
Ret = CreatePipe(hOutRead, hOutWrite, sa, AppData.PipeBufferSize)
If Ret = 0 Then GoTo IntErr
Ret = CreatePipe(hErrRead, hErrWrite, sa, AppData.PipeBufferSize)
If Ret = 0 Then GoTo IntErr

With si
.cb = Len(si)
.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW
.hStdInput = hInRead
.hStdOutput = hOutWrite
.hStdError = hErrWrite
.wShowWindow = 0
End With

If AppData.CGIMode = cmPipes Then
BytesToWrite = Len(InData)
If BytesToWrite > AppData.PipeBufferSize Then BytesToWrite =

AppData.PipeBufferSize
Ret = WriteFile(hInWrite, ByVal InData, BytesToWrite, BytesRW, 0)
If Ret = 0 Then GoTo IntErr
End If

CmdLine = vbNullString
If AppData.CGIMode = cmCmdLineAndPipes And Len(InData) <> 0 Then

CmdLine = " " & InData
End If

Ret = CreateProcess(CGIApp, CmdLine, sa, sa, 1, NORMAL_PRIORITY_CLASS, ByVal
0&, vbNullString, si, pi)
If Ret <> 1 Then

GoTo IntErr
End If

Ret = WaitForSingleObject(pi.hProcess, AppData.CGITimeOut * 1000)
If Ret = WAIT_TIMEOUT Then
TerminateProcess pi.hProcess, 0
End If

Ret = PeekNamedPipe(hErrRead, 0, 0, 0, BytesTotal, 0)
If BytesTotal <> 0 Then

ErrData = String$(AppData.PipeBufferSize, 0)
Ret = ReadFile(hErrRead, ByVal ErrData, Len(ErrData), BytesRW, 0)
If Ret <> 1 Then

GoTo IntErr
End If
ErrData = Left$(ErrData, BytesRW)
End If

If Len(ErrData) = 0 Then
Ret = PeekNamedPipe(hOutRead, 0, 0, 0, BytesTotal, 0)
If BytesTotal <> 0 Then

OutData = String$(AppData.PipeBufferSize, 0)
Ret = ReadFile(hOutRead, ByVal OutData, Len(OutData), BytesRW, 0)
If Ret <> 1 Then

GoTo IntErr
End If
OutData = Left$(OutData, BytesRW)
End If
End If

RunCGIApp = True

ESub:
CloseHandle pi.hProcess
CloseHandle pi.hThread
CloseHandle hInRead
CloseHandle hInWrite
CloseHandle hOutRead
CloseHandle hOutWrite
CloseHandle hErrRead
CloseHandle hErrWrite
Exit Function

IntErr:
Dim lErr&
ErrData = "Internal error" ' & GetLastError & " (" & GetAPIError(GetLastError)
& ")"
GoTo ESub
End Function
============================== Смотри выше ===============================

Всего хорошего!
Дмитрий Козырев aka Master

-+- Microsoft Outlook Express 6.0 + Fidolook SL .86
+ Origin: Дорогу осилит идущий. (2:5023/11.148)
==========================================================================

Всего хорошего!
Дмитрий Козырев aka Master

* Origin: Дорогу осилит идущий. (2:5023/11.148)

двоичное представление числа и сдвиг

Приветствую в нашем подземелье, Nick ?

продолжая изыскания получилось следующее
насчет моего варианта ты был прав два раза :)
я немного модифицировал предложенный тобой вариант
и получил наверно самы й быстрый вариант

ниже прога с тремя вариантами
1й мой
2й от Dmitry Miloserdov
3й от Nick Gorinov + небольшая переделка

итоги на моей машине
1й вариант - 10.09 сек последнее место
2й вариант - 7.57 сек второе место
3й вариант - 4.60 сек первое место

итого IF + ELSE гораздо быстрее логики AND и цикла DO

кому хочется на форму Command1 Command2 Command3 Label1 Label2 Label3
и код :
'=====================================================================
Dim DD(1000000) As Byte
Dim I1 As Long
Dim I2 As Long
Dim SS As String

Private Sub Command1_Click()
t1 = Timer

For I1 = 1 To 1000000
SS = ""
For I2 = 0 To 7
If DD(I1) And (2 ^ I2) Then
SS = SS & "1"
Else
SS = SS & "0"
End If
Next I2
Next I1
t2 = Timer
Label1.Caption = Format(t2 - t1, "##0.000")
End Sub

Private Sub Command2_Click()
t1 = Timer

For I2 = 1 To 1000000
SS = ""
I1 = 256
Do
I1 = I1 \ 2
If (DD(I2) And I1) Then
SS = SS & "1"
Else
SS = SS & "0"
End If
Loop While I1 >= 1

Next I2
t2 = Timer
Label2.Caption = Format(t2 - t1, "##0.000")
End Sub

Private Sub Command3_Click()
Dim DDD As Byte
t1 = Timer

For I2 = 1 To 1000000
SS = ""
DDD = DD(I2)
If DDD >= 128 Then SS = SS & "1": DDD = DDD - 128 Else SS = SS & "0"

If DDD >= 64 Then SS = SS & "1": DDD = DDD - 64 Else SS = SS & "0"

If DDD >= 32 Then SS = SS & "1": DDD = DDD - 32 Else SS = SS & "0"

If DDD >= 16 Then SS = SS & "1": DDD = DDD - 16 Else SS = SS & "0"

If DDD >= 8 Then SS = SS & "1": DDD = DDD - 8 Else SS = SS & "0"

If DDD >= 4 Then SS = SS & "1": DDD = DDD - 4 Else SS = SS & "0"

If DDD >= 2 Then SS = SS & "1": DDD = DDD - 2 Else SS = SS & "0"

If DDD = 1 Then SS = SS & "1" Else SS = SS & "0"
Next I2
t2 = Timer
Label3.Caption = Format(t2 - t1, "##0.000")
End Sub

Private Sub Form_Load()
For I1 = 1 To 1000000
DD(II) = Rnd * 255
Next I1
End Sub
Я взял бы частями, но мне нужно сразу. Genrih Rudenok.
* Origin: Genrih Cool! (2:452/25.115)

двоичное представление числа и сдвиг

Приветствую в нашем подземелье, Nick ?

>2. VB - не совсем тот язык, при написании программ на котором стоит

>думать о времени выполнения.

в любом языке стоит думать о времени выполнения - даже в VB

>3. размерность задачи такова, что не имеет значения, сколько она будет

>решаться: 10 или 20 милисекунд.

- мне надо было 20 раз в секунду просчитывать со сдвигами десятичные в бинарный вид количество этих десятичных 1200 каждый из этих 20 раз (псевдо графический дисплей)
вывод текста и графики в реальном времени
- писать надо на VB желание заказчика

итого на машинке типа 3го целерона 1000 все это прекрасно успевается с запасом 20% по времени (после оптимизации приведенной в предыдущем письме)

тоже самое написаное на С делает тоже самое на 3м целероне 700 с таким же запасом

разница почти никакая - время затраченное на VB версию и на C версию различно и очень
примерно 2-3 часа на всю обработку на VB и 1.5 суток на тоже самое на С
притом пишу и на том и на том давно и быстро

Я взял бы частями, но мне нужно сразу. Genrih Rudenok.
* Origin: Genrih Cool! (2:452/25.115)

Ошибка программы

Рад приветствовать тебя, Slava!

07 ноября 2003 в 00:07, Slava Voronin -- Victor Tikhomirov:

VT>> Применительно к Access, что необходимо для _появления_ сообщения

VT>> о недопустимости операции с дальнейшим выходом из программы?


SV> Из справки А97 "Объект Err":

SV> ....

SV> Для того чтобы создать ошибку выполнения в программе, следует

SV> использовать метод Raise.

SV> ....

SV> Т.е. генеришь свою ошибку, выводишь соответсвенно оформленный мессадж

SV> и закрываешь ацесс(или чего там у тебя)


Метод Raise не предназначен для вызова ошибки Microsoft Access или ошибки объекта доступа к данным (DAO).

Т.е. данный способ не подходит для закрытия приложения


Victor

* Origin: Картина Репина: Запорожцы пишут письмо Мерседесу (2:5030/1247.16)

Re: двоичное представление числа и сдвиг

Мы где-то виделись, Genrih?

08 Nov 03 20:58:00 в RU.VISUAL.BASIC Genrih Rudenok -> Nick Gorinov:


GR> итоги на моей машине

GR> 1й вариант - 10.09 сек последнее место

GR> 2й вариант - 7.57 сек второе место

GR> 3й вариант - 4.60 сек первое место


GR> итого IF + ELSE гораздо быстрее логики AND и цикла DO


Предлагаю свой вариант (на 40% быстрее третьего):

============================== Смотри ниже ===============================
Dim Pow2() As Long

Private Sub Command4_Click()
t1 = Timer

Dim lngValue As Long
Dim strDest As String
Dim i&, j&

For i = 1& To 1000000&
lngValue = DD(i)
strDest = " "
For j = 0& To 7&
If lngValue And Pow2(j) Then
Mid$(strDest, 8& - j, 1&) = "1"
Else
Mid$(strDest, 8& - j, 1&) = "0"
End If
Next j
Next i
t2 = Timer
Label4.Caption = Format(t2 - t1, "##0.000")
End Sub

Private Sub Form_Load()
Dim i&
ReDim Pow2(7)
For i = 0 To 7
Pow2(i) = 2 ^ i
Next i
End Sub
============================== Смотри выше ===============================

GR> Private Sub Form_Load()

GR> For I1 = 1 To 1000000

GR> DD(II) = Rnd * 255


Опечатка: не II, а I1.

GR> Next I1

GR> End Sub


Всего хорошего!
Дмитрий Козырев aka Master

P.S. Hа самом деле это не мой вариант, а сборка из идей всей эхи. ;) Все-таки
эта тема уже не первый раз здесь обсуждается.

* Origin: Дорогу осилит идущий. (2:5023/11.148)

NT

Здравствуй, All!

Вопросы такие.

1. Как в HТ (XP/2K) прописать в систему драйвер (SYS файл)? Помещение в system32\drivers недостаточно. Может ли Inno Setup сам прописывать драйвера?

2. Манифест файл. Программа собрана на VB6. Манифест файл, пробовал редактировать и оставлять как есть. Манифест кладетс в каталог к программе, exe запускается, далее звук критической ошибки и все. Hикаких сообщений, программа не стартует. Стоит убрать илипереименовать манифетс - все нормально.
Что может быть, как работать с манифест-файлом?

3. Как в 9X обратится к данным на хдд, не включенным в разделы? Вот таким способом: CreateFile("\\.\VWIN32", ..............) можно получить доступ только к логическому диску.


Удачи!

* Origin: "Made in Heaven" Queen (2:5020/794.77)

присваивание значения выражению

Привет, Dmitriy!

09 Nov 03 10:42, Dmitriy Kozyrev wrote to Genrih Rudenok:

DK> Mid$(strDest, 8& - j, 1&) = "1"

бррр! не понял... присваивание значения выражению? как оно работает? пока у
меня только одна мысль о том, что Mid$ возвращает ссылку на строку.

_впервые_ встречаю подобную конструкцию, не видел такого ни в одном языке.
подобные вещи обычно делаются совсем по другому. например:
strcpy(&strDest[8-j],"1");

С уважением, Nick!
np: кулеры, винты, уличный шум, etc.

* Origin: Ловись коннект большой и маленький! (2:5038/15.1)

двоичное представление числа и сдвиг

Привет, Genrih!

08 Nov 03 21:08, Genrih Rudenok wrote to Nick Gorinov:

>> 2. VB - не совсем тот язык, при написании программ на котором стоит

>> думать о времени выполнения.

GR> в любом языке стоит думать о времени выполнения - даже в VB

после некоторого порога оптимизации ИМХО стоит уходить на другой язык или же
реализовывать на другом языке только критичные по времени части программы.

>> 3. размерность задачи такова, что не имеет значения, сколько она

>> будет решаться: 10 или 20 милисекунд.

GR> - мне надо было 20 раз в секунду просчитывать со сдвигами десятичные в

GR> бинарный вид количество этих десятичных 1200 каждый из этих 20 раз

GR> (псевдо графический дисплей) вывод текста и графики в реальном времени

GR> - писать надо на VB желание заказчика

А откуда берутся числа, которые надо переводить? не является ли их получение
узким местом?

GR> итого на машинке типа 3го целерона 1000 все это прекрасно успевается

GR> с запасом 20% по времени (после оптимизации приведенной в предыдущем

GR> письме)


GR> тоже самое написаное на С делает тоже самое на 3м целероне 700 с

GR> таким же запасом

закинь, плз, код на C. в эху может и не стоит... в мыло кидай. кстати, какой
именно компилятор С использовался?

GR> разница почти никакая - время затраченное на VB версию и на C версию

GR> различно и очень примерно 2-3 часа на всю обработку на VB и 1.5 суток

GR> на тоже самое на С притом пишу и на том и на том давно и быстро

HЕ ВЕРЮ! если исходить из того, что абстрактному программисту известны оба
языка в необходимом объеме, известен алгоритм и то, что этот абстрактный
программист не допускает ошибок, то времена реализации не будут настолько
отличаться, ибо в этом случае время написания будет определяться только объемом
кода.
При приближении модели к реальности еще можно учесть допущение алгоритмических
ошибок примерно в одинаковом объеме в каждом из исходников. затраты на их поиск
также отличаться почти не будут.
Синтаксических ошибок по крайней мере я почти не допускаю(пишу в основном на
С++).

С уважением, Nick!
np: кулеры, винты, уличный шум, etc.

* Origin: Ловись коннект большой и маленький! (2:5038/15.1)