Выяснил где грабли, параметры из 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
Впрочем вся эта ситуация описана в хелпе, еще один повод читать документацию, даже если думаешь, что знаешь продукт вдоль и поперек.