COM-Automation в VisualWorks Smalltalk
Хорошо, но мало: например, не все
типы COM VARIANT-ов поддерживаются. Мне, в частности, понадобился тип VT_INT (код 22).
Насколько я понимаю, обычный для Smalltalk подход при кодировании или раскодировании бинарных данных, представленных в виде блоков с идентификаторами типа -- вместо большого ветвления (switch) делать массив или хэш-таблицу с селекторами (т.е. именами) маленьких методов, каждый из которых обрабатывает блоки своего типа.
Я добавил кодер и декодер для VT_INT в стандартный класс COMVariantStructure, и прописал их в массивах
EncoderSelectors и
DecoderSelectors, создаваемых в методе
initializeTranslationMaps:
DecoderSelectors := #(
#xEMPTY #xNULL #xI2 #xI4 #xR4 #xR8 #xCY #xDATE #xBSTR
#xDISPATCH #xERROR #xBOOL #xVARIANT #xUNKNOWN
#xIllegal #xIllegal #xIllegal #xUI1 #xUI2 #xUI4 #xIllegal #xIllegal #xINT ).
EncoderSelectors := #(
#xEMPTY: #xNULL: #xI2: #xI4: #xR4: #xR8: #xCY: #xDATE: #xBSTR:
#xDISPATCH: #xERROR: #xBOOL: #xVARIANT: #xUNKNOWN:
#xIllegal: #xIllegal: #xIllegal: #xUI1: #xUI2: #xUI4: #xIllegal: #xIllegal: #xINT: ).