Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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" в строке).

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам