Описание (объявление) API функции в TLB

Обсуждение вопросов, касающихся указанной технологии.
Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 388
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Описание (объявление) API функции в TLB

Сообщение Diamock » 19.09.2015 (Сб) 19:02

Здравствуйте Уважаемые!
Создаю tlb, нужно объявить API функцию ShellExecute. Воспользовался для этого двумя источниками:
MSDN
Код: Выделить всё
HINSTANCE ShellExecute(
  _In_opt_ HWND    hwnd,
  _In_opt_ LPCTSTR lpOperation,
  _In_     LPCTSTR lpFile,
  _In_opt_ LPCTSTR lpParameters,
  _In_opt_ LPCTSTR lpDirectory,
  _In_     INT     nShowCmd
);

и
shellapi.h
Код: Выделить всё
WINSHELLAPI HINSTANCE APIENTRY ShellExecuteA(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd);

Для компиляции использовал код:
Код: Выделить всё
[
    dllname("Shell32.dll")
]
module Shell {

   [entry("ShellExecuteA")]
   HINSTANCE ShellExecute(
      [in] HWND hwnd,
      [in] LPCTSTR lpOperation,
      [in] LPCTSTR lpFile,
      [in] LPCTSTR lpParameters,
      [in] LPCTSTR lpDirectory,
      [in] INT nShowCmd);
}

Получил следующее:
Код: Выделить всё
Function ShellExecute(hwnd As wireHWND, lpOperation As String, lpFile As String, lpParameters As String, lpDirectory As String, nShowCmd As Long) As Any

hwnd As wireHWND - откуда взялось это объявление, мне не совсем понятно.
Для получения стандартного вида
Код: Выделить всё
Function ShellExecute(hwnd As Long, lpOperation As String, lpFile As String, lpParameters As String, lpDirectory As String, nShowCmd As Long) As Long

изменил описание следующим образом
Код: Выделить всё
[
    dllname("Shell32.dll")
]
module ModuleExemple {

   [entry("ShellExecuteA")]
   LONG ShellExecute(
      [in] LONG hwnd,
      [in] LPCTSTR lpOperation,
      [in] LPCTSTR lpFile,
      [in] LPCTSTR lpParameters,
      [in] LPCTSTR lpDirectory,
      [in] INT nShowCmd);
}

Правильно это или нет?
In der Beschrankung zeigt sich erst der Meister
Графоманю...

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

Re: Описание (объявление) API функции в TLB

Сообщение ger_kar » 20.09.2015 (Вс) 9:08

Правильно. Дело в том, что информация в MSDN и объявления в хидерах расчитаны на применение с С++, а TLB расчитаны для применения с COM, соответственно и типы должны быть COM совместимыми, и они же будут полностью совместимы с VB6. Для того, что-бы использовать например тип HWND, то нужно добавить его описание, а иначе получится не пойми что.
Бороться и искать, найти и перепрятать

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

Re: Описание (объявление) API функции в TLB

Сообщение Хакер » 20.09.2015 (Вс) 13:57

Diamock писал(а):Правильно это или нет?

Фактически да, формально нет. Вместо LPCTSTR нужно использовать LPCSTR, поскольку ты безальтернативно указываешь импорт ansi-варианта функции.

Другой вопрос, зачем ущемлять самого себя и использовать ansi-вариант вместо того, чтобы использовать юникодный вариант? Зачем быть неандертальцем?

Что касается типа HWND, то его можно сделать, объявив typedef, но его нужно обязательно снабдить UUID-ом. Тогда в пространстве имён VB окажется новый тип HWND. Можно будет при объявлении переменных и аргументов писать As HWND.

Но здесь есть такая проблема: VB IDE использует единый словарь для всех идентификаторов и под капотом представляет весь код проекта не как строку, а как дерево сущностей с отсылкой к словарю имён сущностей. Это значит, что не получится иметь переменную «hWnd» с типом «HWND». Всё будет приводиться к единому варианту написания, что не может радовать глаз.
—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: Описание (объявление) API функции в TLB

Сообщение ger_kar » 20.09.2015 (Вс) 15:37

Хакер писал(а):Фактически да, формально нет. Вместо LPCTSTR нужно использовать LPCSTR, поскольку ты безальтернативно указываешь импорт ansi-варианта функции.
Так у него же ещё указано [entry("ShellExecuteA")], тогда и его нужно на [entry("ShellExecuteW")]поменять.

Хакер писал(а):Можно будет при объявлении переменных и аргументов писать As HWND.
Хакер писал(а):Это значит, что не получится иметь переменную «hWnd» с типом «HWND». Всё будет приводиться к единому варианту написания
Т.е. Объявив переменную как As HWND и нажав Энтер будем лицезретьAs Long?
Хакер писал(а):что не может радовать глаз.
А в чем радость то?
Бороться и искать, найти и перепрятать

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

Re: Описание (объявление) API функции в TLB

Сообщение Хакер » 20.09.2015 (Вс) 16:11

ger_kar писал(а):Так у него же ещё указано [entry("ShellExecuteA")], тогда и его нужно на [entry("ShellExecuteW")]поменять.

Ты не прав.

ger_kar писал(а):Т.е. Объявив переменную как As HWND и нажав Энтер будем лицезретьAs Long?

Нет.

ger_kar писал(а):А в чем радость то?

Написано «не может радовать», а не «не может не радовать».
—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: Описание (объявление) API функции в TLB

Сообщение ger_kar » 20.09.2015 (Вс) 16:38

Тогда ничего не понимаю.
Хакер писал(а):Фактически да, формально нет. Вместо LPCTSTR нужно использовать LPCSTR, поскольку ты безальтернативно указываешь импорт ansi-варианта функции.Другой вопрос, зачем ущемлять самого себя и использовать ansi-вариант вместо того, чтобы использовать юникодный вариант? Зачем быть неандертальцем?
Ну так, и нужно ведь указать юникодный вариант с юникодными же аргументами. Разве не так? Если указать ansi - вариант самой функции ShellExecuteA, то как изменение аргументов приведет к вызову юникодной функции?

Хакер писал(а):VB IDE использует единый словарь для всех идентификаторов и под капотом представляет весь код проекта не как строку, а как дерево сущностей с отсылкой к словарю имён сущностей. Это значит, что не получится иметь переменную «hWnd» с типом «HWND». Всё будет приводиться к единому варианту написания
Так к какому единому варианту тогда приведется написание, если я неправ наcчёт As long?
Бороться и искать, найти и перепрятать

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

Re: Описание (объявление) API функции в TLB

Сообщение Хакер » 20.09.2015 (Вс) 16:41

ger_kar писал(а):Ну так, и нужно ведь указать юникодный вариант с юникодными же аргументами. Разве не так? Если указать ansi - вариант самой функции ShellExecuteA, то как изменение аргументов приведет к вызову юникодной функции?

В отцитированном фрагменте юникода речь вообще не касается.

ger_kar писал(а):Так к какому единому варианту тогда приведется написание, если я неправ наcчёт As long?

Как карта ляжет. Может везде станет «hWnd», а может везде станет «HWND» (в том числе, например, при доступе к свойствам контролов).
—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: Описание (объявление) API функции в TLB

Сообщение ger_kar » 20.09.2015 (Вс) 16:56

Хакер писал(а):В отцитированном фрагменте юникода речь вообще не касается.
А чего оно тогда касается? В общем все запутал окончательно.
Бороться и искать, найти и перепрятать

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

Re: Описание (объявление) API функции в TLB

Сообщение Хакер » 20.09.2015 (Вс) 17:00

ger_kar писал(а):В общем все запутал окончательно.

Замены LPCTSTR на LPCSTR.
—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: Описание (объявление) API функции в TLB

Сообщение ger_kar » 20.09.2015 (Вс) 17:16

Тогда в чем смысл этой замены, без замены самого вызова функции с анси на юникодный вариант?
Бороться и искать, найти и перепрятать

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Описание (объявление) API функции в TLB

Сообщение iGrok » 20.09.2015 (Вс) 18:14

ger_kar писал(а):Тогда в чем смысл этой замены, без замены самого вызова функции с анси на юникодный вариант?

Ты бы хоть посмотрел, что это за типы. Тут обратная замена, не анси - юникод, а наоборот.
label:
cli
jmp label

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

Re: Описание (объявление) API функции в TLB

Сообщение Хакер » 20.09.2015 (Вс) 18:32

ger_kar писал(а):Тогда в чем смысл этой замены

В том, что LPCTSTR может раскрыться либо в LPCSTR (ANSI-строка), либо в LPCWSTR (Wide-строка) — в зависимости от констант условной компиляции. А должен раскрыться безоговорочно в LPCSTR, раз жестко указан A-вариант. Жестко — значит без привязки к условной компиляции.
—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: Описание (объявление) API функции в TLB

Сообщение ger_kar » 20.09.2015 (Вс) 21:14

Хакер писал(а):В том, что LPCTSTR может раскрыться либо в LPCSTR, либо в LPCWSTR в зависимости от констант условной компиляции
Ну это в С++, а VB6 как будет реагировать? И опять же в С++ это реализовано через макросы в хидерах, где и просходит трансляция. А с TLB такая трансляция будет работать?
Бороться и искать, найти и перепрятать

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

Re: Описание (объявление) API функции в TLB

Сообщение Хакер » 20.09.2015 (Вс) 21:17

Трансляция LPCTSTR в ansi- или wide-строку будет происходить на этапе компиляции TLB.
—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: Описание (объявление) API функции в TLB

Сообщение ger_kar » 21.10.2015 (Ср) 7:19

Хакер писал(а):Трансляция LPCTSTR в ansi- или wide-строку будет происходить на этапе компиляции TLB.
А как можно расставить константы условной компиляции и соответственно условия, которые на них будут реагировать для IDL? Как например будет выглядеть приведенный в этой теме код с константами условной компиляции? Любой фрагмент кода обрамлять, точно также как в С++, или есть свои особенности? И где задавать сами константы? В самом теле кода IDL или как параметры командной строки при компиляции?
Бороться и искать, найти и перепрятать


Вернуться в OLE / COM / ActiveX

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList