1 (изменено: Elena, 2016-04-28 00:26:08)

Тема: AHK: Как создать свою DLL и вызвать ее из AutoHotkey

Не получается вызвать свою функцию (функция в своей .dll) из AutoHotkey .

Вот файл testDLL.cpp будущей .dll:


#include <stdio.h>

long int testfunc(long int a, long int b)
{
   return a + b;
}

Компилирую его, в независимую dll библиотеку используя MinGW, следующими командами:
g++.exe -o testDLL.o -c testDLL.cpp
g++.exe -static -static-libgcc -static-libstdc++ -shared -o testDLL.dll testDLL.o


Вот содержимое кода AutoHotkey:


; --- тест вызова dll (кнопка поиск на мультимедиа клаве) ---
Browser_Search::
    Result := DllCall("testDLL.dll\testfunc", "Int", 10, "Int", 20)
    MsgBox, DLL вернула значение: %Result% , ErrorLevel: %ErrorLevel%
return

В результате всего этого на выходе имеем:
DLL вернула значение:  , ErrorLevel: -3

ErrorLevel: -3: это значит невозможно обратиться к указанному DllFile.

Пробовала убрать из .cpp файла аргументы функции testfunc и просто сделать return 1; и соответственно вызывать DLL без параметров - это тоже не помогает. Dll лежит в той же директории что и сам AutoHotkey.

Кто уже писал свои .dll? Подскажите что я делаю не так и что нужно чтобы вызвать функцию из своей .dll?
Всем спасибо кто откликнется .

2 (изменено: Elena, 2016-04-27 22:54:54)

Re: AHK: Как создать свою DLL и вызвать ее из AutoHotkey

Вот вариант кода для C# библиотеки:


using System;
public class ClassFunc
{
    public int testfunc(int a, int b)
    {
        return a + b;
    }
}

Команда для компиляции этого файла:
csc.exe /t:library /out:testDLL.dll testDLL.cs

AutoHotkey видит библиотеку но не может найти в ней функцию
Результат работы с C# библиотекой, на выходе имеем:
DLL вернула значение:  , ErrorLevel: -4

ErrorLevel: -4: это значит указанная функция не найдена в DLL.

Пробовала варианты, ни один из вариантов не работает:


Result := DllCall("testDLL.dll\testfunc", "Int", 10, "Int", 20)
Result := DllCall("testDLL.dll\ClassFunc.testfunc", "Int", 10, "Int", 20)
Result := DllCall("testDLL.dll\ClassFunc\testfunc", "Int", 10, "Int", 20)

Что нужно поменять чтобы AutoHotkey смог вызвать функцию из C# библиотеки?

3

Re: AHK: Как создать свою DLL и вызвать ее из AutoHotkey

Может быть LoadLibrary сначала, или путь к длл указывать полные.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK: Как создать свою DLL и вызвать ее из AutoHotkey

serzh82saratov В первом случаи AutoHotkey вообще не видит Dll, во втором случаи он видит Dll но не может в ней найти функцию. Dll лежит в той же папке что и сам AutoHotkey, поэтому все должно работать без указания путей.
Есть подозрение что в исходные с++ и C# файлы нужно что-то добавить чтобы получились полноценные библиотеки. Что именно пока не знаю.

5

Re: AHK: Как создать свою DLL и вызвать ее из AutoHotkey

https://autohotkey.com/docs/commands/DllCall.htm

-3: The specified DllFile could not be accessed or loaded. If no explicit path was specified for DllFile, the file must exist in the system's PATH or A_WorkingDir. This error might also occur if the user lacks permission to access the file, or if AutoHotkey is 32-bit and the DLL is 64-bit or vice versa.

-4: The specified function could not be found inside the DLL.

6

Re: AHK: Как создать свою DLL и вызвать ее из AutoHotkey

Malcev, приведенную инструкцию читала когда писала код, там все понятно. Там есть пример вызова функции из самого AutoHotkey, но нет примера как написать самому функцию в Dll библиотеке.
Коды ошибок приведены в тексте, я их пояснила.

7

Re: AHK: Как создать свою DLL и вызвать ее из AutoHotkey

В первом примере у вас путаница с названиями: при компиляции testDDL, при обращении — testDLL.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Как создать свою DLL и вызвать ее из AutoHotkey

А битности dll и автохотки совпадают?

9 (изменено: Elena, 2016-04-28 00:36:22)

Re: AHK: Как создать свою DLL и вызвать ее из AutoHotkey

teadrinker пишет:

В первом примере у вас путаница с названиями: при компиляции testDDL, при обращении — testDLL.

Это опечатка тут на форуме (уже исправила), я просто руками команды набирала и ошиблась, а так у меня все компилируется автоматически и имена фалов тоже автоматом вставляются.

Malcev пишет:

А битности dll и автохотки совпадают?

Да это обязательно иначе не заработает.

Вот рабочее решение:
Файл testDLL.cpp будущей .dll:


#include <stdio.h>

#define DLLEXPORT __declspec(dllexport)
#define DLLIMPORT __declspec(dllimport)

#ifdef __cplusplus
extern "C" {
#endif

    DLLEXPORT long int testfunc(long int a, long int b)
    {
        return a + b;
    }

#ifdef __cplusplus
}
#endif

Вот содержимое кода AutoHotkey:


; --- тест вызова dll (кнопка поиск на мультимедиа клаве) ---
Browser_Search::
    Result := DllCall("testDLL.dll\testfunc", "Int", 10, "Int", 20 ,"CDecl")
    MsgBox, DLL вернула значение: %Result% , ErrorLevel: %ErrorLevel%
return

Результат работы с C# библиотекой, на выходе имеем:
DLL вернула значение:  30, ErrorLevel: 0

Слава богу, заработало!

10

Re: AHK: Как создать свою DLL и вызвать ее из AutoHotkey

Если нужно, вызвать функцию из DLL на C#, то можно переделать саму DLL и все будет работать. Я проверила, AutoHotkey вызывает функцию.
вот инструкция: http://jonxxx.me/13-metatrader/15-ekspo … metatrader