1 (изменено: svoboden, 2019-08-09 09:42:46)

Тема: AHK: запуск консольного приложения

Добрый день! Вопрос такой: "В общем, создал я незамысловатую DLL.

+ открыть спойлер
#include <Windows.h>
#include <iostream>

using namespace std;

// Главная функция
BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved)
{
  switch(dwReason)
  {
    case DLL_PROCESS_ATTACH:
      break;
    case DLL_THREAD_ATTACH:
      break;
    case DLL_THREAD_DETACH:
      break;
    case DLL_PROCESS_DETACH:
      break;
  }
  return TRUE;
}

extern "C" __declspec(dllexport) void summa(void)
{
   float summ = 0;
 
   cout << "Vvedite summu: ";
   cin >> summ;
   if (summ <= 1000)
   {
      cout << "Summa = " << summ << endl;
   }
   else if (summ > 1500)
   {
      cout << "Summa = " << (summ * 0.93) << endl;
   }
   else
   {
      cout << "Summa = " << (summ * 0.97) << endl;
   }
}

Вызываю через LoadLibrary, понятно, как.

+ открыть спойлер
#include <Windows.h>
#include <iostream>
#include <tchar.h>

using namespace std;

int main()
{
  // Дескриптор DLL-библиотеки
  HMODULE hDll;
  // Указатель на функцию
  void (*dllsumma) (void);

  // Загружаем динамически подключаемую библиотеку
  hDll = LoadLibrary(_T("Dll.dll"));
  if(!hDll)
  {
    cout << _T("Динамическая библиотека не загружена") << endl;
    return GetLastError();
  }
  // Настраиваем адрес функции
  dllsumma = (void (*)(void))GetProcAddress(hDll, "summa");
  if(!dllsumma)
  {
    cout << _T("Ошибка получения адреса функции") << endl;
    return GetLastError();
  }
  // Вызываем функцию из библиотеки
   dllsumma();

  // Отключаем библиотеку
  if(!FreeLibrary(hDll))
  {
    cout << _T("Ошибка выгрузки библиотеки из памяти") << endl;
    return GetLastError();
  }
  // Устанавливаем паузу перед завершением программы
  system("pause");
  return 0;
}

Все работает. Но, вызываю на ahk:

hModule := DllCall("LoadLibrary", "Str", "DLL.dll")
testfunc := DllCall("GetProcAddress", "ptr", hModule, "Astr", "summa")
DllCall(testfunc)

И, понятное дело, не работает.
Вопрос такой:
"Как вызвать консольную программу из DLL".
Заранее спасибо!

2

Re: AHK: запуск консольного приложения

По идее, нужно создать консоль вручную, т.к. AutoHotkey.exe не помечен как консольное приложение, в отличие от вашей С++ проги, и автоматически для него консоль Винда не создаст.

3 (изменено: svoboden, 2019-03-20 10:14:33)

Re: AHK: запуск консольного приложения

YMP, я что-то не понимаю, это как - вручную. Через команду Run, что-ли?

4

Re: AHK: запуск консольного приложения

Нет, через


DllCall("AllocConsole")

А помечать экзешник не надо, ведь для других скриптов вам консоль не нужна.

5 (изменено: svoboden, 2019-03-20 11:06:31)

Re: AHK: запуск консольного приложения

Не, мне нужно через свою DLL-лку вызывать консольные команды. Но понятно, что, наверное, как на cpp не получится.

YMP пишет:

ведь для других скриптов вам консоль не нужна.

Почему, мне нужна.

6

Re: AHK: запуск консольного приложения

svoboden пишет:

Не, мне нужно через свою DLL-лку вызывать консольные команды.

Я так и понял. Но с какой консолью они будут работать? Создайте её указанной командой, а потом вызывайте функции из DLL.

7 (изменено: svoboden, 2019-03-20 12:08:13)

Re: AHK: запуск консольного приложения

Ну, я думал, что есть консольный autohotkey.