Декларации в ODL

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Декларации в ODL

Сообщение NashRus » 17.07.2009 (Пт) 0:28

Пишу в ODL файле:

Код: Выделить всё
    [ dllname("user32.dll"), helpstring("user32 declarations") ]
    module user32 {
        [entry("IsWindow"), helpstring(" ")] long _stdcall IsWindow([in] long hWnd);
    };


Компилирую:

Код: Выделить всё
MKTYPLIB.EXE /tlb Lib.tlb /win32 /o Lib.txt /nologo Lib.odl


Получаю в Object Browser:

Код: Выделить всё
Function IsWindow(hWnd As Long) As Long


Параметр по ссылке. Что не так?

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

Re: Декларации в ODL

Сообщение Хакер » 17.07.2009 (Пт) 0:48

Object Browser просто не отображает ByVal.
Да, неудобно (не определить: ByVal или ByRef), но работать будет правильно, передаваться будет по значению.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Декларации в ODL

Сообщение NashRus » 17.07.2009 (Пт) 0:52

Интелисенс тоже говорит нам (hWnd as Long) когда набиваешь.

Всякие WinTLB же правильно отображаются браузером, правда там исходники на IDL, но каких либо атрибутов я и там в исходниках не нашел...

Ан нет, и там так же. Так как быть? не запомнишь где ссылка, а где значение, если функций порядка тысячи.

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

Re: Декларации в ODL

Сообщение Хакер » 17.07.2009 (Пт) 0:57

NashRus писал(а):Интелисенс тоже говорит нам (hWnd as Long) когда набиваешь.

Ага. Но, повторяю, передаваться всё будет так, как положено.

Всякие WinTLB же правильно отображаются браузером, правда там исходники на IDL, но каких либо атрибутов я и там в исходниках не нашел...

Какие атрибуты? Напишешь int x — будет ByVal x As Long, напишешь int* x — будет ByRef x As Long, напишешь что-то другое — будет неподдерживаемый в VB тип.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Декларации в ODL

Сообщение NashRus » 17.07.2009 (Пт) 1:00

Например, тот же многострадальный CopyMemory.
Как понять как он задекларирован? Все время исходники odl надо иметь перед глазами?
Напишешь сейчас, наутро уже не вспомнишь как писал. А есть же то, чем пользуешься раз в год. Вообще, не реально.

Главное, вообще не видно, а что же функция может вернуть в параметрах в резльтате работы.

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

Re: Декларации в ODL

Сообщение Хакер » 17.07.2009 (Пт) 1:14

Как понять как он задекларирован? Все время исходники odl надо иметь перед глазами?

Можешь держать.
Можешь использовать венгерскую нотацию.
Можешь объявлять всё как void* (ByRef ... As Any), и только при вызове явно указывать, какой тебе нужен тип и как должно передаваться значение.
Можешь написать Add-in, котороый будет смотреть в TLB степень индирекции типа, и выводить свою подсказку.
Может быть ещё что-то можно придумать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Декларации в ODL

Сообщение NashRus » 17.07.2009 (Пт) 1:25

Хакер писал(а):Можешь использовать венгерскую нотацию.


Более менее приемлемо, но InOut параметры не так удобно.
Типа, префикс "l" для out, а для InOut ...

Браузер принципиально не покажет ByVal ? Как не шаманить ?

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

Re: Декларации в ODL

Сообщение Хакер » 17.07.2009 (Пт) 1:33

NashRus писал(а):Более менее приемлемо, но InOut параметры не так удобно.

В рамках VB, с его одноуровневыми ссылками, это довольно удобно. Если параметр передаётся по ссылке, то добавляешь «p». Ни с чем не должно путаться.

Браузер принципиально не покажет ByVal ? Как не шаманить ?

Смотря что понимать под шаманствами.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Декларации в ODL

Сообщение NashRus » 17.07.2009 (Пт) 1:41

Для LONG сделал:

Код: Выделить всё
   typedef [uuid(4A36000E-54CF-49da-87D7-C6301BDE84E7), version(1.0), helpstring(" ")]
   enum {
      _stub = 0
   } LongByVal;
   typedef [uuid(C4318A0E-A4BE-459c-B9D1-29C5AABEBDEA), version(1.0), helpstring(" ")]
   enum {
      _stub = 0
   } LongByRef;

[entry("GetWindowThreadProcessId"), helpstring(" ")] long _stdcall GetWindowThreadProcessId([in] LongByVal hWnd, [in, out] LongByRef* lpdwProcessId);


Выглядит:

Код: Выделить всё
Function GetWindowThreadProcessId(hWnd As LongByVal, lpdwProcessId As LongByRef) As Long

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

Re: Декларации в ODL

Сообщение Хакер » 17.07.2009 (Пт) 1:50

Замысел правильный, реализация — отвратительная.

Вот:
Код: Выделить всё
typedef [uuid(4A36000E-54CF-49da-87D7-C6301BDE84E7)] int  LongByVal;
typedef [uuid(C4318A0E-A4BE-459c-B9D1-29C5AABEBDEA)] int* LongByRef;
...
[entry("GetWindowThreadProcessId")] long _stdcall GetWindowThreadProcessId([in] LongByVal hWnd, [in, out] LongByRef lpdwProcessId);
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Декларации в ODL

Сообщение NashRus » 17.07.2009 (Пт) 2:00

Супер! Я не знал, что так можно. Искал что-то типа define.


Код: Выделить всё
   typedef [uuid(782EF88D-D764-45b7-B97F-141E88AE2A49)] LPSTR   StrByVal;
   typedef [uuid(3A9401C3-1FAD-43eb-8E24-50968213C29F)] LPSTR* StrByRef;


Для строк так будет?

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

Re: Декларации в ODL

Сообщение Хакер » 17.07.2009 (Пт) 2:02

Это будет для любых типов, поддерживамых в VB.

Тип LPSTR не поддерживается VB. BSTR* — ради бога.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Декларации в ODL

Сообщение NashRus » 17.07.2009 (Пт) 2:07

Угу, спасибо Хакер.
Можешь, когда хочешь :)

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Декларации в ODL

Сообщение NashRus » 19.07.2009 (Вс) 2:39

Еще вопрос.

Пишу:

Код: Выделить всё
[ uuid(85E6273B-4FE2-40B6-9DAC-A81E5278D566), version(1.0), helpstring(" ") ]
library Lib
{
    // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
    importlib("stdole2.tlb");
    // Forward declare all types defined in this typelib
    interface IRes;

   typedef [helpstring("Mouse button bitfield constants")]   enum EnumMouseButton {
      [helpstring("Left mouse button")]                     enMouseButtonLeft         = 1,
      [helpstring("Right mouse button")]                     enMouseButtonRight         = 2,
      [helpstring("Middle mouse button")]                     enMouseButtonMiddle         = 4
   } EnumMouseButton;                                                               

   [ odl, uuid(43CEBA16-7DEF-4006-9C99-D44BEA641B3E), version(1.0), dual, nonextensible, oleautomation, helpstring(" ") ]
   interface IRes : IDispatch {      
      [id(0x60030000), helpstring(" ")]
         HRESULT cbkHover([in] int lhWnd, [in] EnumMouseButton enButton);
   };

}


Получаю:

Код: Выделить всё
Implements IRes

Private Sub IRes_cbkHover(ByVal lhWnd As Long, ByVal enButton As Lib.EnumMouseButton)

End Sub


Как сделать, чтобы имя библиотеки опускалось в имлементации ?

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

Re: Декларации в ODL

Сообщение Хакер » 19.07.2009 (Вс) 2:42

Чтобы автоматически не подставлялось VB? Наверное никак.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Декларации в ODL

Сообщение NashRus » 19.07.2009 (Вс) 2:57

С Comctl 5-ой и 6-ой версий вроде такая же история в событиях.
В 5 подставляет имя библиотеки, а в 6-й - нет.

Была моя старая библиотека, смотрю исходники - там имплимент без имени библиотеки. Сейчас заново делаю имплимент в том же проекте - подставляет. Может где имена пересекаются или еще как...

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Декларации в ODL

Сообщение NashRus » 24.07.2009 (Пт) 22:10

Еще вопрос.

Нужно задекларировать структуру:

Код: Выделить всё
Public Type Type1
    sDesc  As String * 128
End Type


Пока пишу так:

Код: Выделить всё
typedef unsigned char   BYTE;
typedef [helpstring(" ")] struct tagType1 {
     [helpstring(" ")] BYTE sDesc[256]; // 128 * 2
} Type1;


Можно как-то сделать, чтобы получалась все-таки строка фиксированной длины?

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

Re: Декларации в ODL

Сообщение Хакер » 24.07.2009 (Пт) 22:27

Нет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Декларации в ODL

Сообщение NashRus » 24.07.2009 (Пт) 23:51

Хорошо, спасибо.

А есть ли способ объявить массив не с 0? Типа, sDesc[1 to 256].

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

Re: Декларации в ODL

Сообщение Хакер » 25.07.2009 (Сб) 0:13

Можно, но афаик с помощью MIDL-а у тебя не получится.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Декларации в ODL

Сообщение NashRus » 25.07.2009 (Сб) 0:21

А с помощью чего получится?

Что-то происходит.
Скомпилировался в очередной раз и пропали все мои
Код: Выделить всё
typedef int  LongByVal;

т.е. в браузере отображается as Long. Хотя задекларировано все как LongByVal.

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

Re: Декларации в ODL

Сообщение Хакер » 25.07.2009 (Сб) 0:31

А гуиды остались?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Декларации в ODL

Сообщение NashRus » 25.07.2009 (Сб) 1:08

+ Точняк. Гуиды-то убрал.

Вот, что получается:
Код: Выделить всё
   #define LONG int
   #define INTEGER short
   typedef [uuid(C976801A-64E5-4c51-A94D-F4BB74363CD0)] short IntByVal;
   typedef [uuid(68F3A023-A663-4bac-A666-449F16223E5B)] short* IntByRef;
   typedef [uuid(EA1387E8-F516-460f-9E45-97F835426AE1)] int LongByVal;
   typedef [uuid(CA7559FA-0DE6-456d-92C0-8EAB8D59BD87)] int* LongByRef;
   typedef [uuid(3D57696A-BFC4-46f6-9F8C-6BE64F7FA76D)] BSTR StrByVal;
   typedef [uuid(4B44C940-89CD-4960-B7FF-5788E08BEC85)] BSTR* StrByRef;
   typedef [uuid(A10DA8C9-80CA-456b-AAE3-B5ACCA4C29F8)] LPSTR StrAnsiByVal;
   typedef [uuid(14A19CF8-3FC9-4167-AF70-2A2893EDAB02)] LPSTR* StrAnsiByRef;
   typedef [uuid(BBE81479-95BB-4ff5-900F-12DB1A72E03E)] unsigned char BYTE;
   typedef [uuid(20A967B7-DB8C-4d28-8815-ED42DA923967)] void* ANY;


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

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

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

    TopList