Что нового

Как обратиться к классу в 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 711
А где сам "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 711
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 711
Тот пример как раз и использует 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 711
Вот для того, чтобы поддерживал, они и написали 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 711
ХЗ. Мне лень разбираться с AutoItObject UDF...

:smile:
 
Автор
Garrett

Garrett

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

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