Страница: 1 |
И так можно создовать консольные приложения в обычном 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) Ну вот теперь создание Консольных приложений можно делать спокойно...
Круто! А кому вообще нужна эта консоль под Виндой? По моему PBWin куда больше подходит. Мне например нужна ,мне интерфейс не нужен +) а вот выводить инфу надо... так что... меньшу кода на ГУЙ +)) соотсвенно .. счас вот делаю грамотные функции работы с консолью... НАДЕЮСЬ ТЕПЕРЬ ГРАЖДАНИН РОККО выложит этот апдейт так как теперь у тебя будет РЕАЛЬНОЕ КОНСОЛЬНОЕ ПРИЛОЖЕНИЕ! то бишь судя по ПЕ заголовку оно реальное консольное .. так что теперьч то тебя останавливает выложить апдейт??? сиди себе и кодь... да кстати с таким аддоном к ПБ удобнее сдало гораздо поставьте его и запустите среду теперь когда у вас открыто более одного документа сверху удобные ТАБы +/)) Ты меня заинтриговал. Уже качаю. 1)По ПЕ заголовку ... если ... тип приложения консольное то заставляет загрузчик виндовс открыть консоль .... в которую можно писать .. потом ... через АПИ например и тд.. отличается от консольаллокейт тем что оно настоящие .. консольное... 2. А тут они рантайм добавляются то бишь хочешь добавил хочешь прям сразу убрал... и тд итп очень удобно... 3. Ну если у етбя там много ресурсов то чтоб не замедлять даже на пару секунд компиляцию программы то можно после первой компиляции отключить компиляцию файлов ресурсов так как он уже создан.. 4. Ну малоли ты не хочешь показывать какие функции ты импортируешь... малоли... меньше знают крепче спят +) 5. Позже напишу... 6. если брать ПБ то это полноценное 32битное приложение но только ... благодаря тому что оно консольное заставляет загрузчик виндовс открыть окно консоли +) при этом... ничего тебе не мешает создать диалог и тд и тп... 4. В смысле эти импортируемые ф-ции не видны в отладчиках, так? 5.А позже это когда? > то бишь судя по ПЕ заголовку оно реальное консольное Объясни, что ты имеешь ввиду. > 4. В смысле эти импортируемые ф-ции не видны в отладчиках, так? Отладчики подставляют вместо адреса имя функции, принимая за аргументы адрес, по которому отмаппирована в адресное пространство DLL и предварительно полученные из оригинала имена экспортируемых функций. У каждого Портебл Екзекуттебл есть заголовок .. +) так вот в этом заголовке ест много полезной информации для загрузчика включая... и тип приложения... не буду вдоваться в описание ПЕ заголовка его найдёшь в гугле например и тд.... за тип прилождения отвечает флаг так вот ... если там стоит ГУЙ то окно доса не будет открыто при загрузки приложения и наооборот .. вообщем вот список... возможных типов 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 то форма и тд итп появится .... сдесь никаких ошибок не будет .... но при этом и откроты будет окно консольное.. вообщем эксперементируй... Тьфу ты, не прочитал название форума. Все нормально, я знаю формат PE-файлов 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 >'% 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 чего-то нихрена не цепляет к файлу... Во всяком случае, как был размер файла без него, так и остался такой же с ним. Так что? Никто не знает, что это за параметры ByVal hInstance As Dword, szLegend As String, szAttachedFileData As String, и как можно заполучить адреса ф-ций, содержащихся в DLL? Страница: 1 |
Вопрос: Препроцессор by Семён Матусовский и создание ко...
Добавлено: 09.05.04 14:13
Автор вопроса: Fallout | Web-сайт:
Ответы
Всего ответов: 14
Номер ответа: 1
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #1
Добавлено: 09.05.04 14:36
Номер ответа: 2
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #2
Добавлено: 09.05.04 15:38
Номер ответа: 3
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #3
Добавлено: 09.05.04 15:41
Номер ответа: 4
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #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-сайт:
Профиль | | #6
Добавлено: 11.05.04 08:31
Номер ответа: 7
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #7
Добавлено: 11.05.04 13:44
Номер ответа: 8
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #8
Добавлено: 11.05.04 20:10
Номер ответа: 9
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #9
Добавлено: 11.05.04 22:15
Номер ответа: 10
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #10
Добавлено: 12.05.04 01:19
Номер ответа: 11
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #11
Добавлено: 12.05.04 08:30
Номер ответа: 12
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #12
Добавлено: 13.05.04 00:25
Номер ответа: 13
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #13
Добавлено: 14.05.04 10:36
Номер ответа: 14
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #14
Добавлено: 16.05.04 17:22