Страница: 1 |
Страница: 1 |
Вопрос: Типы параметров
Добавлено: 31.05.06 21:36
Автор вопроса: Gruntor
Помогите нубу, плз...
Есть DLL, в ней есть функция
function F1
(
pcszPackedData : LPCSTR;
pszBuff1 : LPSTR;
): BOOL;
stdcall; external 'My.dll';
Как описать в VB-проге pcszPackedData и pszBuff1 и обратиться к F1?
Связь с самой DLL настроил...
Не дайте помереть, с басиком перывй раз борюся...
Ответы
Всего ответов: 8
Номер ответа: 1
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #1
Добавлено: 01.06.06 11:19
Option Explicit
Private Declare Function F1 Lib "My.dll" (ByVal pcszPackedData As String, ByVal pszBuff1 As String) As Long
Private Sub Form_Load()
Dim RetVal As Long
RetVal = F1("MyData1", "MyData2"
End Sub
Номер ответа: 2
Автор ответа:
Viper
ICQ: 249094859
Вопросов: 0
Ответов: 310
Профиль | | #2
Добавлено: 01.06.06 12:02
с маленькой добавочкой. Судя по исходному коду, параметр pszBuff1 предназначен для возвращения чего-то полезного, так что вместо "MyData2" стоит передавать строковый буфер нужной длины. А уж какая длина автор должен знать.
Номер ответа: 3
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #3
Добавлено: 01.06.06 12:16
В принципе да, но декларацию это не меняет.
Передавай вместо "MyData2" че-нить типа Space(255) или String(255, 0). Только я бы добавил бы еще один параметр для возвращения длины "использованного" буфера.
Номер ответа: 4
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #4
Добавлено: 01.06.06 14:42
Зачем ещё параметр?
Просто сменить BOOL на int, и возвращать strlen.
Номер ответа: 5
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #5
Добавлено: 01.06.06 14:50
Гы... Тогда уж сразу возвращать BSTR* при одном параметре
Кому как нравится. К слову, я привык retval параметром возвращать HRESULT, остальное in/out.
Номер ответа: 6
Автор ответа:
Gruntor
Вопросов: 1
Ответов: 1
Профиль | | #6
Добавлено: 02.06.06 21:53
Спасибо откликнувшимся!
DLL получена из сторонней организации и менять в ней они ничего не будут
Декларация и вызов сейчас таковы:
==========================
Private Declare Function F1 Lib "My.dll" (ByVal p1 As String, ByVal s1 As String) As Boolean
..
Dim pcszPackedData As String
Dim pszBuff1 As String
Dim bUnpackSuccess As Boolean
..
Private Sub Form_Load()
bUnpackSuccess = F1(pcszPackedData, pszBuff1)
If bUnpackSuccess Then
MsgBox "Результат: " + pszBuff1 + ".", vbExclamation
End If
End Sub
===============================
В результате pszBuff1 -- пуст.
Пробовал в декларации F1 писать ByRef s1 -- прога вылетает.
Связался с автором DLL, он на VB не пишет, взамен прислал пример обращения к F1 на Дельфях:
=====================================
procedure Unpack(const strPackedData: string);
var
pszBuff1: array[0..9] of char;
bUnpackSuccess: boolean;
..
begin
..
bUnpackSuccess:=F1(PChar(strPackedData), pszBuff1);
..
=====================================
Типа char в VB6 нет... На VB.Net писать не хочу
Номер ответа: 7
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #7
Добавлено: 06.06.06 10:07
Ну тебе же сказали - pszBuff1 - это буффер. Задай ему некую начальную величину, скажем, как в выше изложенном примере
pszBuff1 = String(10, 0)
перед вызовом функции.
Номер ответа: 8
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #8
Добавлено: 06.06.06 10:09
ЗЫ Либо pszBuff1 = Space(10), затем Trim, если все это корректно отработает (некоторые кустарные библы нездорово воспринимают отсутствие "\0" в строке).