Программно определите, установлена ли библиотека COM (.DLL)

Я не уверен, что это соответствует вашим потребностям, но вы можете сделать это (для двоичного файла без PIE, так что ссылка с -no-pie):

.text
.global _start
_start:
    /* exit */
    mov $60, %rax
.Lmylabel:
    mov [110], %rdi
    syscall
    .section .rodata
mylabel:
    .long .Lmylabel

Затем, вы можете установить точка останова с использованием break *mylabel (обратите внимание на *):

(gdb) break *mylabel
Breakpoint 2 at 0x401007: file t.S, line 7.

Поскольку mylabel является более или менее указателем на функцию, GDB ничего об этом не знает и будет игнорировать это:

[ 112]

С помощью сценария компоновщика должна быть возможность поместить символ mylabel в раздел, который не загружен, чтобы уменьшить накладные расходы времени выполнения.

6
задан dthrasher 2 April 2009 в 14:46
поделиться

2 ответа

То, что я обычно делал (и сделал бы, если бы мне было нужно это снова), является попыткой создать экземпляр объекта класса, который Вы знаете, находится в библиотеке COM - или ProgID или GUID - и проверяющий на отказ.

4
ответ дан 17 December 2019 в 07:09
поделиться

Попытайтесь создать его и обработать ошибку если нет.

Под Win32 CoCreateInstance возвратится REGDB_E_CLASSNOTREG если не установленный (включая, IIRC, если зарегистрировано, но dll/exe реализация его затем удалена).

Под.NET сгенерированный взаимодействующий с COM блок бросит некоторую ошибку (должен проверить это, не имейте удобного кода для тестирования на который тип исключительной ситуации).Примечание. если interop блок будет отсутствовать затем, то это будут рассматривать как недостающий блок, возможно ведущий к ошибке загрузки приложения.

0
ответ дан 17 December 2019 в 07:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: