Преобразование типов при TLB импорте

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Преобразование типов при TLB импорте

Сообщение ger_kar » 15.06.2012 (Пт) 13:07

Если производить вызовы WinApi функций объявленных посредством Declare, то VB автоматически конвертирует тип передаваемых данных из внутреннего представления VB, в тип с которым работают WinApi функции . В основном это касается строк, либо структур со строковыми полями. А если функции WinApi импортируются не через Declare, а через объявления в TLB, то механизм конвертации будет работать аналогичным образом или будут какие то отличия?
Бороться и искать, найти и перепрятать

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Преобразование типов при TLB импорте

Сообщение Vi » 20.06.2012 (Ср) 9:58

VB будет переводить тип данных аргумента к типу данных параметра. Возможно, механизм там разный, возможно, Declare трансформируется во внутреннее представление, совместимое с описанием из TLB, однако для пользователя результат будет одинаков: будет передан тот тип, который указан в описании метода/функции. Как правило, этим не заморачиваются.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

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

Re: Преобразование типов при TLB импорте

Сообщение Хакер » 20.06.2012 (Ср) 11:18

Vi, нет, он о другом спрашивает.
В Declare при объявлении указание аргументу типа String всегда означает тип AnsiString, и VB всегда будет переводить BSTR (который используется непосредственно самим VB5/VB6/VBA для работу со строками, равно как и всем COM-ом) в LPSTR с помощью WideCharToMultiByte. Более того, после возврата строка будет переведена обратно в BSTR с помощью MultuByteToWideChar.

В любом случае, Declare никак не даёт отказаться от конвертации Unicode→Ansi до вызова, и обратного Ansi→Unicode после вызова.

А вот TLB дают возможность влиять на то, будет ли какое-то преобразование, или нет. У нас в распоряжении три типа: LPSTR, LPWSTR и BSTR.
Для примера вот такая библиотека:
Код: Выделить всё
library TestOfTypes
{
   [dllname("msvbvm60")]
   module DummyContainer
   {
      [entry("VarPtr")] void DummyLPSTR(LPSTR param);
      [entry("VarPtr")] void DummyLPWSTR(LPWSTR param);
      [entry("VarPtr")] void DummyBstr(BSTR param);      
   }
}


И вот такой VB код:
Код: Выделить всё
Public Sub Main()
    Test "hello world"
End Sub

Public Sub Test(ByRef s As String)
    DummyLPSTR s
    DummyLPWSTR s
    DummyBstr s
End Sub

В первом случае VB сделает пару конвертацией, обрамив вызов VarPtr (обозванную как DummyLPSTR) парой вызовов __vbaStrToAnsi (до вызова VarPtr) и __vbaStrToUnicode (после вызова VarPtr). Во втором и третьем случае никаких конвертаций не будет, оба раза в VarPtr будет передан один и тот же указатель на оригинальную юникодную строку. Таким образом разницы между LPWSTR и BSTR нет, но есть разница между LPWSTR и LPSTR. При LPWSTR и BSTR конвертации туда-сюда нет, при LPSTR — конвертация есть.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Преобразование типов при TLB импорте

Сообщение ger_kar » 20.06.2012 (Ср) 17:33

Спасибо, ответ был познавательным для меня.
Бороться и искать, найти и перепрятать


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

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

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

    TopList