Вы сказали, что пытаетесь вызвать функцию, которая не была экспортирована; насколько я знаю, это невозможно из Python. Однако ваша проблема, похоже, заключается в том, что название искажено.
Вы можете вызвать произвольный экспорт, используя ctypes. Поскольку имя искажено и не является допустимым идентификатором Python, вы можете использовать getattr ().
Другой подход, если у вас есть правильная информация, - это найти экспорт по порядковому номеру, что вам нужно сделать, если имя не было экспортировано вообще. Одним из способов получения порядкового номера будет использование dumpbin.exe, включенного во многие скомпилированные языки Windows. На самом деле это внешний интерфейс компоновщика, поэтому, если у вас есть MS LinK.exe, вы также можете использовать его с соответствующими переключателями командной строки.
Чтобы получить ссылку на функцию (которая является объектом «указатель на функцию», связанный с ее адресом), вы можете использовать что-то вроде:
импортные типы
func = getattr (ctypes.windll.msvcrt, "@@ myfunc")
retval = func (нет)
Естественно, вы бы заменили 'msvcrt' на dll, которую вы специально хотите вызвать.
Что я здесь не показываю, так это то, как разобрать имя, чтобы получить вызывающую подпись, и, следовательно, необходимые аргументы. Для этого потребуется demangler, и он очень специфичен для марки AND VERSION компилятора C ++, используемого для создания DLL.
Существует определенное количество ошибок, проверяющих, является ли функция stdcall, поэтому вы можете иногда возиться с вещами, пока не получите их правильно. Но если функция cdecl, то нет автоматической проверки. Точно так же вы должны не забыть включить дополнительный параметр в случае необходимости.