FileListBox не работает в скомпилированном EXE

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

FileListBox не работает в скомпилированном EXE

Сообщение jangle » 29.02.2012 (Ср) 16:24

Я похоже схожу с ума. Вот этот код запускается из под IDE, все работает нормально.
Но если его скомпилировать в EXE, форма просто не отображается, событие Form_Activate не происходит и приложение сразу закрывается.
Это что за баг такой? :shock:


Код: Выделить всё
Private Sub Form_Activate()

msgbox "Активация формы"

Dim file1 As FileListBox
Set file1 = Me.Controls.Add("VB.FileListBox", "FileListBox")

End Sub

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

Re: FileListBox не работает в скомпилированном EXE

Сообщение jangle » 29.02.2012 (Ср) 16:44

Наконец понял в чем проблема, не буду удалять топик, может кому пригодится.
Код
Код: Выделить всё
Set file1 = Me.Controls.Add("VB.FileListBox", "FileListBox")
обламывается в скомпилированном EXE если в одной папке с экзешником лежит файл манифеста.

MyApplication.exe
MyApplication.exe.manifest

Манифест который вызывает этот баг

Код: Выделить всё
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
   version="1.0.0.0"
   processorArchitecture="X86"
   name="MyApplication"
   type="win32"
/>
<description>Notes information manager</description>
<dependency>
   <dependentAssembly>
     <assemblyIdentity
       type="win32"
       name="Microsoft.Windows.Common-Controls"
       version="6.0.0.0"
       processorArchitecture="X86"
       publicKeyToken="6595b64144ccf1df"
       language="*"
     />
   </dependentAssembly>
</dependency>
</assembly>


ХЗ почему это происходит, но если удалить или переименовать файл манифеста, в экзешнике все работает нормально

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

Re: FileListBox не работает в скомпилированном EXE

Сообщение Хакер » 29.02.2012 (Ср) 16:49

А библиотека-то подгружается насильно? В смысле: ты это сделал точно?
—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: FileListBox не работает в скомпилированном EXE

Сообщение jangle » 29.02.2012 (Ср) 16:58

Хакер писал(а):А библиотека-то подгружается насильно? В смысле: ты это сделал точно?


Когда файл манифеста подключен? Не знаю. Только без него все работает нормально.

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

Re: FileListBox не работает в скомпилированном EXE

Сообщение Хакер » 29.02.2012 (Ср) 17:05

Есть такая функция InitCommonControls. Многие удивляются, что она ничего не делает. Она действительно ничего не делает (состоит из одной инструкции retn).

Суть этой функции для Си(++) программистов в том, что с тех пор, как они поставили её вызов, функция попала в таблицу импорта, и теперь загрузчик в самый момент загрузки (до вызова WinMain) уже разрулит SxS-случай. Так что сишники её могут даже не вызвать на самом деле, достаточно наличия импорта.

К VB-шникам это относится в той же степени, если они импортируют эту функцию через TLB. Если они «импортируют» её через Declare, то функция не попадает в стандартную таблицу импорта, и тогда функцию придётся вызвать (но в самом начале приложения), чтобы это библиотека (comctl32.dll) подгрузилась и SxS-менеджер мог подгрузить «левую» библиотеку, вместо стандартной.

Иными словами, роль этой функции очень специфична — насильно заставить загрузить правильный образ comctl32.dll

Ты позаботился об этом?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


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

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

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

    TopList