Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 1 |

 

  Вопрос: Препроцессор by Семён Матусовский и создание ко... Добавлено: 09.05.04 14:13  

Автор вопроса:  Fallout | Web-сайт: mudator.by.ru

И так можно создовать консольные приложения в обычном PBWIN 7!!! (раньше тоже можно было через алокейтКонсоль правки ПЕ заголовка и тд но теперь всё проще и автоматом) и ещё кое что... для этого качаем вначале препроцессор Семёна.

http://www.zdt.ru/Pb/dsbPrePbEd.Exe

Далее инсталируем его туда куда надо +)

и запускаем ярлык.. который у вас появился на раб столе... либо PrePbEd.Exe в папке куда вы инсталили

Перевожу возможности с нерусского для нас языка +)

1. Создание .Pbr "на лету" (до компиляции)

Добваит содержимое RC-файла (ресурс файла) в основной .BAS модуль.

Добваить '% RC TEXT

*для добавления каждого ресурса нужно добвить новую строку

Пример:

'% RC TEXT 101 ICON Rc\Ltr.Ico

'% RC TEXT Sema BITMAP Ltr.Bmp

да да строки пишутся как коментариии

Когда кликнишь по "Compile" (или по "Compile & Execute") кнопке в IDE ... его прога перехватывает этот вызов и обрабатывает основной BAS модуль далее создаёт ~Tmp.Rc файл в текущей директории ... далее вызывает Rc.Exe и PbRes.Exe в результате ~Tmp.Pbr переменовывается в точ то прописано в ПоверБасик $Resource

Обычно нет необходимости в создании .Pbr файла кажды раз. Что бы каждый раз не компилился ресурс файл поставим вот эту опцию

'% RC COMPILE OFF

Когда надо перекомпилить его снова то смени OFF на ON.

2. Спрятать импортируемые ДЛЛ (после компиляции до выполнения)

Синтексис значит такой

'% DELAY LOAD LibName

LibName должно быть такое же как и Lib параметр в декларации

Sub (Function).

3. Прилепить файл в EOF(конец файла) откомпиленного модуля будь то DLL или EXE

'% ATTACH Path ALIAS Alias

Пример:

'% ATTACH "C:\Zlb Dir\zlib.dll" ALIAS "zlib 1.14" Alias используется при выполение внутри LoadAttachedFile функции.

4. Сменить подсистему

Синтексис такой

'% SUBSYSTEM Type (Type = GUI или CONSOLE)

Ну вот теперь создание Консольных приложений можно делать спокойно...

Ответить

  Ответы Всего ответов: 14  

Номер ответа: 1
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #1
Добавлено: 09.05.04 14:36

Круто!

А кому вообще нужна эта консоль под Виндой?

По моему PBWin куда больше подходит.

Ответить

Номер ответа: 2
Автор ответа:
 Fallout



Вопросов: 10
Ответов: 387
 Web-сайт: mudator.by.ru
 Профиль | | #2
Добавлено: 09.05.04 15:38

Мне например нужна ,мне интерфейс не нужен +) а вот выводить инфу надо... так что... меньшу кода на ГУЙ +)) соотсвенно .. счас вот делаю грамотные функции работы с консолью... НАДЕЮСЬ ТЕПЕРЬ ГРАЖДАНИН РОККО выложит этот апдейт так как теперь у тебя будет РЕАЛЬНОЕ КОНСОЛЬНОЕ ПРИЛОЖЕНИЕ! то бишь судя по ПЕ заголовку оно реальное консольное .. так что теперьч то тебя останавливает выложить апдейт??? сиди себе и кодь...

Ответить

Номер ответа: 3
Автор ответа:
 Fallout



Вопросов: 10
Ответов: 387
 Web-сайт: mudator.by.ru
 Профиль | | #3
Добавлено: 09.05.04 15:41

да кстати с таким аддоном к ПБ удобнее сдало гораздо поставьте его и запустите среду теперь когда у вас открыто более одного документа сверху удобные ТАБы +/))

Ответить

Номер ответа: 4
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #4
Добавлено: 09.05.04 17:04

Ты меня заинтриговал. :)

Уже качаю.

Ответить

Номер ответа: 5
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #5 Добавлено: 10.05.04 16:59
Народ вы меня просветите немного, а то чего-то я не понимаю:
1. Что есть консольное приложение, зачем оно вообще?
2.Так ли затруднительно добавлять ресурсы что крайне необходимо перенести это в файл .bas?
3.Кому мешает, что файл ресурсов может компилиться каждый раз. Почему это необходимо запретить?
4.Зачем и от кого нужно прятать импортируемые ДЛЛ ?
5.А если прилепить файл в конец откомпиленного модуля, то как к нему потом обращаться, например если это dll и нужна какая-нибудь ф-ция из неё?
6.И ещё раз:консольное приложение - это что такое????

Ответить

Номер ответа: 6
Автор ответа:
 Fallout



Вопросов: 10
Ответов: 387
 Web-сайт: mudator.by.ru
 Профиль | | #6
Добавлено: 11.05.04 08:31

1)По ПЕ заголовку ... если ... тип приложения консольное то заставляет загрузчик виндовс открыть консоль .... в которую можно писать .. потом ... через АПИ например и тд.. отличается от консольаллокейт тем что оно настоящие .. консольное...

2. А тут они рантайм добавляются то бишь хочешь добавил хочешь прям сразу убрал... и тд итп очень удобно...

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

4. Ну малоли ты не хочешь показывать какие функции ты импортируешь... малоли... меньше знают крепче спят +)

5. Позже напишу...

6. если брать ПБ то это полноценное 32битное приложение но только ... благодаря тому что оно консольное заставляет загрузчик виндовс открыть окно консоли +) при этом... ничего тебе не мешает создать диалог и тд и тп...

Ответить

Номер ответа: 7
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #7 Добавлено: 11.05.04 13:44

4. В смысле эти импортируемые ф-ции не видны в отладчиках, так?

5.А позже это когда?

Ответить

Номер ответа: 8
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #8
Добавлено: 11.05.04 20:10

> то бишь судя по ПЕ заголовку оно реальное консольное

Объясни, что ты имеешь ввиду.

> 4. В смысле эти импортируемые ф-ции не видны в отладчиках, так?

Отладчики подставляют вместо адреса имя функции, принимая за аргументы адрес, по которому отмаппирована в адресное пространство DLL и предварительно полученные из оригинала имена экспортируемых функций.

Ответить

Номер ответа: 9
Автор ответа:
 Fallout



Вопросов: 10
Ответов: 387
 Web-сайт: mudator.by.ru
 Профиль | | #9
Добавлено: 11.05.04 22:15

У каждого Портебл Екзекуттебл есть заголовок .. +) так вот в этом заголовке ест много полезной информации для загрузчика включая... и тип приложения... не буду вдоваться в описание ПЕ заголовка его найдёшь в гугле например и тд.... за тип прилождения отвечает флаг так вот ... если там стоит ГУЙ то окно доса не будет открыто при загрузки приложения и наооборот .. вообщем вот список... возможных типов

00 - Unknown

01 - Native

02 - Windows GUI

03 - Windows Console

05 - OS/2 Console

07 - Posix Console

08 - Native Windows9x Driver

09 - Windows CE

0A - EFI application

0B - EFI boot service device

0C - EFI runtime driver

0D - EFI ROM

0E - X-Box

открой по оффсету 220 (если по ВБ то 221) в любой хекс едиторе или в басике прочитай ... 1 байт ... и увидишь что у ГУЙных он будет равено 2 а у консольных 3... и так если ты заменишь у гуйного приложения этот байтик на 3 то форма и тд итп появится .... сдесь никаких ошибок не будет .... но при этом и откроты будет окно консольное.. вообщем эксперементируй...

Ответить

Номер ответа: 10
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #10
Добавлено: 12.05.04 01:19

Тьфу ты, не прочитал название форума. Все нормально, я знаю формат PE-файлов :)

Ответить

Номер ответа: 11
Автор ответа:
 Fallout



Вопросов: 10
Ответов: 387
 Web-сайт: mudator.by.ru
 Профиль | | #11
Добавлено: 12.05.04 08:30

5.

Function LoadAttachedFile(ByVal hInstance As Dword, szLegend As String, szAttachedFileData As String) As Dword

' To free (very small) Static arrays, call LoadAttachedFile with hInstance = 0

Dim hInstanceOld As Static Dword

Dim nAttachedFiles As Static Dword

Dim LofPE As Static Dword

Dim OffsetsSizes() As Static Dword

Dim szAttachedFileLegend() As Static String

Dim f As Static Dword

Dim i As Local Dword

Dim j As Local Dword

Dim k As Local Dword

Dim szTmp As Local String

Dim azPePath As Local Asciiz * %MAX_PATH

Dim lpImageDosHeader As Local IMAGE_DOS_HEADER Ptr

Dim lpImageNtHeaders As Local IMAGE_NT_HEADERS Ptr

Dim lpImageSectionHeader As Local IMAGE_SECTION_HEADER Ptr

Do

If hInstance = 0 Then Exit Do

If hInstance <> hInstanceOld Then

If f Then Close #f: f = 0

lpImageDosHeader = hInstance

If @lpImageDosHeader.e_magic <> %IMAGE_DOS_SIGNATURE Then hInstance = 0: Exit Do ' invalid DOS signature

lpImageNtHeaders = lpImageDosHeader + @lpImageDosHeader.e_lfanew

If @lpImageNtHeaders.Signature <> %IMAGE_NT_SIGNATURE Then hInstance = 0: Exit Do ' invalid NT signature

If @lpImageNtHeaders.FileHeader.SizeOfOptionalHeader <> SizeOf(@lpImageNtHeaders.OptionalHeader) Or _

@lpImageNtHeaders.OptionalHeader.Magic <> %IMAGE_NT_OPTIONAL_HDR32_MAGIC Then hInstance = 0: Exit Do

lpImageSectionHeader = lpImageNtHeaders + SizeOf(IMAGE_NT_HEADERS)

If GetModuleFileName (hInstance, azPePath, SizeOf(azPePath)) = 0 Then hInstance = 0: Exit Do

f = FreeFile: Err = 0

Open azPePath For Binary Shared As #f: If Err Then f = 0: hInstance = 0: Exit Do

j = lpImageSectionHeader - lpImageDosHeader

i = SizeOf(IMAGE_SECTION_HEADER) * @lpImageNtHeaders.FileHeader.NumberOfSections

LofPE = Lof(f): If LofPE < (j + i) Then Err = 1: Exit Do

Seek #f, j + 1: Get$ #f, i, szTmp: If Err Then Exit Do

lpImageSectionHeader = StrPtr(szTmp): j = j + i

For i = 0 To @lpImageNtHeaders.FileHeader.NumberOfSections - 1

j = Max(j, @lpImageSectionHeader[i].PointerToRawData + @lpImageSectionHeader[i].SizeOfRawData)

Next

If LofPE < (j + 12) Then Err = 1: Exit Do

Seek #f, j + 1: Get$ #f, 12, szTmp: If Err Then Exit Do

If Cvl(szTmp, 1) <> 19900821 Then Err = 1: Exit Do

nAttachedFiles = Cvl(szTmp, 9)

ReDim OffsetsSizes(3 + nAttachedFiles + nAttachedFiles)

i = (UBound(OffsetsSizes()) + 1) * 4

If LofPE < (j + i) Then Err = 1: Exit Do

Seek #f, j + 1: Get$ #f, i, szTmp: If Err Then Exit Do

MoveMemory ByVal VarPtr(OffsetsSizes(0)), ByVal StrPtr(szTmp), i

ReDim szAttachedFileLegend(nAttachedFiles - 1)

i = OffsetsSizes(nAttachedFiles + 3) - j

If LofPE < (j + i) Then Err = 1: Exit Do

Seek #f, j + 1: Get$ #f, i, szTmp: If Err Then Exit Do

For i = 1 To nAttachedFiles

szAttachedFileLegend(i - 1) = Mid$(szTmp, OffsetsSizes(i + 2) - j + 1, OffsetsSizes(i + 3) - OffsetsSizes(i + 2) - 1)

Next

End If

Exit Do

Loop

If Err Then hInstance = 0

If hInstance Then

Do

szTmp = UCase$(szLegend)

i = 0

For k = 1 To nAttachedFiles

If szTmp = szAttachedFileLegend(k - 1) Then i = k: Exit For

Next

If i = 0 Then Err = 1: Exit Do

j = OffsetsSizes(nAttachedFiles + 2 + i)

k = OffsetsSizes(nAttachedFiles + 3 + i) - OffsetsSizes(nAttachedFiles + 2 + i)

If LofPE < (j + k) Then Err = 1: Exit Do

Err = 0: Seek #f, j + 1: Get$ #f, k, szAttachedFileData

Function = 1: Exit Do

Loop

If Err Then szAttachedFileData = "": Function = 0

End If

If hInstance = 0 Then

If f Then Close #f: f = 0

szAttachedFileData = ""

Erase OffsetsSizes(), szAttachedFileLegend()

End If

hInstanceOld = hInstance

End Function

Ответить

Номер ответа: 12
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #12 Добавлено: 13.05.04 00:25
 

Ответить

Номер ответа: 13
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #13 Добавлено: 14.05.04 10:36

>'% ATTACH "C:\Zlb Dir\zlib.dll" ALIAS "zlib 1.14" Alias используется при выполение внутри LoadAttachedFile функции.

Народ, можно ли поподробнее, где используется этот Alias, чего-то я его не приметил в ф-ции. И что за входные параметры у ф-ции LoadAttachedFile(ByVal hInstance As Dword, szLegend As String, szAttachedFileData As String) ? Ну hInstance - понятно, а остальные два параметра кто такие, даже не кто такие, а как ими пользоваться. Если можно, какой-нибудь несложный пример, чтоб понятно было, плиз.

И ещё: '%ATTACH чего-то нихрена не цепляет к файлу... Во всяком случае, как был размер файла без него, так и остался такой же с ним.

Ответить

Номер ответа: 14
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #14 Добавлено: 16.05.04 17:22

Так что? Никто не знает, что это за параметры

ByVal hInstance As Dword, szLegend As String, szAttachedFileData As String, и как можно заполучить адреса ф-ций, содержащихся в DLL?

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам