Исправление ошибки в поддержке асинхронного COM при запуске приложения

В статье Асинхронный COM под Windows Vista и Windows 7 была описана ошибка, которая появилась при выходе указанных операционных систем. Для разрабатываемого (а на тот момент уже и продававшегося) программного обеспечения надежная работа асинхронного COM была очень важна. Обращения в Microsoft с просьбой внести исправления ничем не закончились. Оставался только один вариант — самостоятельное исправление

Передача строки из функции на Go в код на C без выделения памяти (часть 2)

В прошлой статье мы обсуждали возможность передачи строки без выделения памяти. При попытке использовать этот метод в реальных проектах выяснилось, что есть случаи, когда метод неприменим. Все работает отлично, если объект string был сконструирован из статической строковой константы или конкатенацией констант. Если же string представляет собой результат объединения других объектов, при выполнении программы произойдет исключение: mystr :=

Передача строки без выделения памяти из функции на Go в код на C (часть 1)

Документация по CGO весьма скудно освещает вопрос передачи строк. Сказано только одно – используйте функцию C.CString() для преобразования объекта string в понятный коду на C указатель на буфер со строкой, завершенной нулем — char*. Все хорошо, но при этом выделяется блок памяти (malloc), который необходимо удалять вызовом (free), закончив его использование. Несколько расточительно, если функцию

Перехват вызова функций заменой байтов заголовка инструкциями JMP или CALL

В одной из предыдущих статей я описывал метод перехвата функций, используя таблицу импорта. Данный метод более универсален, так как дает возможность осуществлять перехват вызова функций, если известен только их адрес в памяти (ограничения приведены ниже). Однако он и более сложен, поскольку, как дальше будет показано, требует от кода модифицирования заголовка функции навыков дизассемблирования. Суть метода в