Что нового

Как обратиться к классу в DLL?

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
964
Приветствую всех!

Есть DLL "MyFunction.dll", в ней (предположим) есть функция:
[box]public: void __thiscall MyFunction::Load(char const *,char const *)[/box]
Из всего этого я делаю заключение что:
Функция: public
Имя: Load ; загружает данные в экземпляр класса MyFunction
Класс: MyFunction ; экземпляр класса MyFunction
Возвращает: void

Имеет два параметра
:
Первый: str Const
Второй: str Const

Вопрос:
Как из Autoit обратится к функции Load, чтобы она загрузила данные в экземпляр класса MyFunction, и вернула нам void?
*Точнее, ничего не вернула, а просто выполнила свою функцию :smile:

Вариант:
Код:
DllCall($h_Dll, "none", "Load", "str", $STR1, "str", $STR2)

Успеха не принёс!
Получаем ошибку "function" not found in the DLL file
Однако функция есть!
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
у меня в свое время так и не получилось подключить библиотеку с очень мудреной системой иерархически вложенных классов. в итоге я все бросил и подключил либу к проекту в C# :smile: потому что прилинковать ее не получилось даже в С++. это я к тому, что возможность подключения библиотеки зависит не только от наличия самой функции в ней, но и от того, как эта функция написана
 

amel27

Продвинутый
Сообщения
146
Репутация
55
вроде как DllCall только для API32 Dll, для COM нужно через ObjCreate/ObjGet
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
А где сам "MyFunction.dll"? Хотелось бы на него взглянуть. Скорее всего функция там называется по другому, например "[email protected]".
 
Автор
Garrett

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
964
Yashied
Да практически в любой из DLL в папке System32 есть DLL с подобными функциями.
К примеру, в CMUTIL.DLL функция:
[box]public: void __thiscall CIniA::SetPrimaryRegPath(char const *)[/box]
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Garrett сказал(а):
Как обратиться к классу в DLL?

Да по ходу дела в AutoIt это так просто не получится сделать. Экземпляр объекта загружается с помощью функции CoCreateInstance(), но в AutoIt с ним ничего не получится сделать. Правда можно еще попытаться использовать AutoItObject UDF, но я с ним не разбирался. Вот хороший пример на эту тему (где-то у нас на форуме про это уже спрашивали).

P.S

Но IMHO все это через ж***.

:smile:
 
Автор
Garrett

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
964
Yashied
Спасибо! Я отложил эту затею пока.

Да по ходу дела в AutoIt это так просто не получится сделать.
Согласен.

Экземпляр объекта загружается с помощью функции CoCreateInstance(), но в AutoIt с ним ничего не получится сделать. Правда, можно еще попытаться использовать AutoItObject UDF, но я с ним не разбирался. Вот хороший пример на эту тему (где-то у нас на форуме про это уже спрашивали).
AutoItObject UDF у меня есть, хорошая библиотека, правда пока я с ней тесно не связывался.
Однако AutoItObject работает только с COM. В примере, на который вы дали ссылку, идёт обращение к объектной модели через CLSID, так как DLL не поддерживает IDispatch-объект для COM-интерфейсов.

P.S. Перефразируя тов. Саахова: "Ничего, будем думать! Через день мысль придёт, через неделю пойдём в правильном направлении, а через месяц найдём решение! Ничего, будем думать!" ;D
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Тот пример как раз и использует IDispatch. Собственно как я понимаю AutoItObject UDF и был сделан для него.
 
Автор
Garrett

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
964
В справке по AutoItObject UDF написано:
[box title=_AutoItObject_WrapperCreate]Creates an IDispatch-Object for COM-Interfaces normally not supportting it.[/box]
То есть, как я понял (со своим знанием en :-[) функция создаёт IDispatch для COM интерфейса, который не поддерживает его.
Поправьте если что не так, буду только признателен!
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Вот для того, чтобы поддерживал, они и написали AutoItObject UDF. В том примере используется ITaskbarList3, который наследует IDispatch.

Creates an IDispatch-Object for COM-Interfaces normally not supportting it.

Создает объект IDispatch для COM, который не поддерживается AutoIt'ом по умолчанию.
 
Автор
Garrett

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
964
Yashied
Ок.
Вот пример заголовочного файла Dll MyClass.h
Код:
// Класс MyClass
class MyClass
{

	void* result;

public:
	// Конструктор
	MyClass();

	// Деструктор
	~MyClass();

	static MyClass& GetInstance();

	// Загрузка файла
	void Load(const char* file);

};
Тут боюсь, AutoItObject UDF не поможет, да и DllCall тоже :(
Код:
public: void __thiscall MyClass::Load(char const *)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
ХЗ. Мне лень разбираться с AutoItObject UDF...

:smile:
 
Автор
Garrett

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
964
Yashied сказал(а):
ХЗ. Мне лень разбираться с AutoItObject UDF...

:smile:
Да не стоит! Спасибо! :smile:
Я просто встал в тупик, вот и решил спросить. Разберусь! :smile:
С AutoItObject UDF я разобрался, там как раз то ничего сложного, всё те же принципы ООП, ну разве немого своеобразный синтаксис.
 
Верх