![]() |
eXeL@B —› Программирование —› нужно разобраться COM CAPICOM |
Посл.ответ | Сообщение |
|
Создано: 13 ноября 2009 14:01 · Поправил: DMD · Личное сообщение · #1 всех приветствую ![]() собственно проблема - как работать с CAPICOM в асме (fasm)? об инсталляции самого CAPICOM - не говорим.. и так понятно. CoInitialize + CoCreateInstance - тут все понятно... меня интересует интерфейс Utilities ссылка на msdn msdn.microsoft.com/en-us/library/aa388176(VS.85).aspx CLSID {22A85CE1-F011-4231-B9E4-7E7A0438F71B} ; ProgID - "CAPICOM.Utilities.1" IID {EB166CF6-2AE6-44DA-BD96-0C1635D183FE} ; "IUtilities" методы этого интерфейса - тоже известны... но в каком порядке они "лежат" в vtable?!?! и вот еще одна непонятность: попробовал последовательно получать указатели на интерфейсы CAPICOM.Utilities.1 Code:
те. указатели на "IUnknown" "IDispatch" "IUtilities" - все эквивалентны.. как такое может быть?! тем более что указатели, полученные и через IUnknown "QueryInterface" и через прямой вызов CoCreateInstance, совпадают. Code:
но опять не все ясно: методов у "IUtilities" - 9, а в таблице всего два элемента Ps статьи на васм'е не особо помогли... кое-что там уже давно устарело... да и многое не описано. ![]() |
|
Создано: 13 ноября 2009 15:18 · Поправил: Av0id · Личное сообщение · #2 может что-нибудь в этом духе? Code:
![]() |
|
Создано: 13 ноября 2009 20:28 · Поправил: DMD · Личное сообщение · #3 Av0id пишет: может что-нибудь в этом духе? нет, в этом духе не подойдет приведенный вариант псевдо-кода - это практически классическое описание COM вся ерунда в том, что struct IUtilities описана "руками" как Code:
а после получения указателя на этот интерфейс в памяти имеем следующее: Code:
те. в vtable имеем всего два элемента,,,, что я и описал #1 ps может быть я и не прав, но при получении указателей через IUnknown обрабатывать его счетчик через AddRef мне не пришлось - он сам увеличивался. pps если последовательность элементов struct IUtilities взята "от M$"... тогда это не факт ![]() |
|
Создано: 14 ноября 2009 11:55 · Личное сообщение · #4 |
|
Создано: 16 ноября 2009 15:06 · Поправил: DMD · Личное сообщение · #5 мда... все же удалось в fasm заставить эту (не знаю как по-мягче ее назвать) концепцию закодировать стринг в Base64. сначала ответы на вопросы: CLSID {22A85CE1-F011-4231-B9E4-7E7A0438F71B} ; ProgID - "CAPICOM.Utilities.1" IID {EB166CF6-2AE6-44DA-BD96-0C1635D183FE} ; "IUtilities" это все правильно... предложенная структура vtable: struct IUtilities QueryInterface dd ? AddRef dd ? Release dd ? Base64Decode dd ? Base64Encode dd ? BinaryStringToByteArray dd ? BinaryToHex dd ? ByteArrayToBinaryString dd ? GetRandom dd ? HexToBinary dd ? LocalTimeToUTCTime dd ? UTCTimeToLocalTime dd ? ends похоже, была взята из msdn и.. гм .. неверна.. точнее, почти верна и к тому же на msdn она приведена в алфавитном порядке. по-уму, эта таблица выглядит так: QueryInterface AddRef Release GetTypeInfoCount GetTypeInfo GetIDsOfNames Invoke GetRandom Base64Encode Base64Decode BinaryToHex HexToBinary BinaryStringToByteArray ByteArrayToBinaryString LocalTimeToUTCTime UTCTimeToLocalTime о проблемах по порядку: - спасибо Hangatyr'у за указание о первом (опущенном во всех описаниях) параметре (статья за 2004 год!). никто не обозвал это указателем_на_Context - а зря... что-то было проще в понимании. - указатели_на_указатели - эта фишка вымотает любые нервы - структура стрингов: с явным указанием длины в [$-4] - коды ошибок на столько разнообразны, на сколько и засекречены. что где искать - неизвестно. E_OUTOFMEMORY 8007000E Out of memory error не вполне помогает при поиске ошибки в описании стринга и его длины. может быть, на высокоуровневых языках многое будет проще чем на асме. но в любом случае, если потребуется выполнить, на пример, скрипт на VB в асме (пример есть на васм), те. с пустого места определить последовательность элементарных действий (методов) для выполнения поставленной задачи будет не совсем просто. а так, для простых действий (кодирование/декодирование и пр.) использовать вполне можно. ![]() |
|
Создано: 16 ноября 2009 19:07 · Личное сообщение · #6 |
|
Создано: 17 ноября 2009 12:23 · Поправил: DMD · Личное сообщение · #7 Av0id пишет: capicom sdk подними и узнаешь про коды ошибок смотрел... не нашел,,, тут и то лучше описано (коды ошибок): Av0id пишет: выложишь пример код под такую последовательность: CLSID -> GUID_IUnknow -> IUnknown(_IID_IUtilities) (но можно пользоваться и такой последовательностью: CLSID -> GUID_IUtilities) Code:
у меня есть замечание & еще несколько вопросов: - к результату добавляются два байта 0х0D +0х0A.. нужно это учитывать.. - можно ли бойтись без инсталляции всего пакета? (мы подразумеваем CAPICOM) я о regsvr32.exe + CAPICOM.dll... и самый насущный в приложении СОМ вопрос по fasm: ок, мы получили указатель на интерфейс, вытащили указатель на vtable + "руками" описали структуру vtable. можно ли как-нибуть это связать? что бы пользоваться call [.Base64Decode] а не call [edx+0xC0] ![]() |
|
Создано: 19 ноября 2009 17:39 · Поправил: Av0id · Личное сообщение · #8 нет, в этом духе не подойдет только в итоге получилось почему-то именно в этом духе DMD пишет: ок, мы получили указатель на интерфейс, вытащили указатель на vtable + "руками" описали структуру vtable. можно ли как-нибуть это связать? что бы пользоваться call [.Base64Decode] а не call [edx+0xC0] см. мой первый пост внимательнее, макрос comcall и пример его использования там же в твоем случае: comcall [adr_Interface],IUtilities.Base64Encode,Input_String,adr_Out_string смотрел... не нашел,,, плохо смотрел ![]() |
|
Создано: 20 ноября 2009 10:58 · Личное сообщение · #9 |
![]() |
eXeL@B —› Программирование —› нужно разобраться COM CAPICOM |
Эта тема закрыта. Ответы больше не принимаются. |