Падает при выходе из DLL

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

Падает при выходе из DLL

Сообщение jangle » 02.09.2009 (Ср) 17:49

Блин мозги закипели. При выходе из функции находящийся в Native Dll VB падает, причем только в экзешнике, при запуске из IDE все ОК.
Управление уже вышло из DLL но еще не вернулось в VB, причем после закрытия окна с ошибкой, в DLL отрабатывает DLL_PROCESS_DETACH,
т.е. программа уже взорвалась, а DLL которую она использует еще работает. Что за фигня никак не могу понять, что-то со стеком?
Функцию вызываю так

Код: Выделить всё
Private Declare Function LoadConfig Lib "PARSER.dll" (ByVal FILE As String, ByRef DB As String, ByRef ConnectStr As String, ByRef CatalogAkdDoc As String) As Long

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

Re: Падает при выходе из DLL

Сообщение jangle » 04.09.2009 (Пт) 10:49

Выяснил где грабли, параметры из VB в DLL передаются как ASCIIZ строка, а не OLE String (aka BSTR). Поэтому такой код будет работать с ошибками, падая в непредсказуемые моменты.

Неправильный код

Код: Выделить всё
VB EXE
Private Declare Function LoadConfig Lib "PARSER.dll" (ByVal FILE As String, ByRef DB As String, ByRef ConnectStr As String, ByRef CatalogAkdDoc As String) As Long


Код: Выделить всё
PB DLL
Function LoadConfig    Alias "LoadConfig"   (Byval file As String, ByRef  DB As String,  ByRef  ConnectStr  As String,   ByRef  CatalogAkdDoc  As String) Export As Long


Самое смешно, что выше написанный код будет работать! Строки нормально передаются из VB в DLL и обратно. Но в определенные моменты, или на определенных наборах данных программа будет падать. С ума можно сойти в поиске ошибки...

А вот правильный вариант

Код: Выделить всё
VB EXE
Private Declare Function LoadConfig Lib "PARSER.dll" (ByVal file As String, ByVal DB As String, ByVal ConnectStr As String, ByVal CatalogAkdDoc As String) As Long


Код: Выделить всё
PB DLL
Function LoadConfig    Alias "LoadConfig"   (file As Asciiz, DB As Asciiz, ConnectStr  As Asciiz, CatalogAkdDoc  As Asciiz) Export As Long


Обратите внимание, хотя переменные DB, ConnectStr, CatalogAkdDoc записаны как ByVal, на самом деле они передаются как ByRef ! В DLL на PowerBASIC переменные декларируются как Asciiz а не String
Впрочем вся эта ситуация описана в хелпе, еще один повод читать документацию, даже если думаешь, что знаешь продукт вдоль и поперек.


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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 99

    TopList