Как я могу превратить мою программу в файл .dll и запустить его в cmd, используя rundll32.exe? - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть программа, которая создает несколько потоков и печатает несколько строк в цикле. Моя задача - превратить эту программу в .dll и запустить ее с помощью rundll32.exe, но я понятия не имею, как я могу запустить .dll как исполняемый файл.

 #define _CRT_SECURE_NO_WARNINGS
#include<windows.h>
#include <stdlib.h>
#include<process.h>
#include<stdio.h>
#include<string>
#include<ctime>
#include<vector>
#include<iostream>

typedef struct {
    std::string info;
    unsigned int m_number;
    int m_stop_thread;
    int m_priority_thread;
    unsigned m_cycles;
    unsigned m_currentThread;
}data;
HANDLE tmp;
unsigned int __stdcall Func(void* d) {
    data* real = (data*)d;
    std::cout << "\nCurrent thread ID: " << GetCurrentThreadId() << std::endl;
    if (real->m_currentThread == real->m_priority_thread)
        SetThreadPriority(tmp, 2);
        std::cout << "Thread priority: " << GetThreadPriority(tmp) << std::endl;
    for (int j = (real->m_currentThread - 1) * real->m_cycles / real->m_number;j < real->m_currentThread * real->m_cycles / real->m_number;j++) {
        for (int i = 0;i < real->info.size();++i)
            std::cout << real->info[i];
        std::cout << std::endl;
    }
    return 0;
}

int main(int argc, char* argv[]) {
    int threadsNumber, priority, stop;
    std::string str;
    std::cout << "Enter the info about a student:\n";
    std::getline(std::cin, str);
    std::cout << "Enter the number of threads:\n";
    std::cin >> threadsNumber;
    int cycles;
    std::cout << "Enter the number of cycles:\n";
    std::cin >> cycles;
    std::cout << "Which thread priority do you want to change? ";
    std::cin >> priority;
    std::cout << "Which thread do you want to stop? ";
    std::cin >> stop;
    std::vector<HANDLE> threads;

    data* args = new data;
    args->info = str;
    args->m_number = threadsNumber;
    args->m_cycles = cycles;
    args->m_priority_thread = priority;
    args->m_stop_thread = stop;
    clock_t time = clock();
    for (int i = 1;i <= threadsNumber;++i) {
        args->m_currentThread = i;
        tmp = (HANDLE)_beginthreadex(0, 0, &Func, args, 0, 0);

        threads.push_back(tmp);
    }
    WaitForMultipleObjects(threads.size(), &threads.front(), TRUE, INFINITE);
    time = clock() - time;
    std::cout << "time: " << (double)time / CLOCKS_PER_SEC << "s" << std::endl << std::endl;
    getchar();
    return 0;
}

Кто-нибудь знает, как я могу поместить этот код в DLL и запустить его с помощью командной строки?

1 Ответ

0 голосов
/ 03 ноября 2019

Когда вы компилируете свою программу, вы создаете что-то под названием Portable Executable [PE] в Windows. Среди файлов, которые разделяют это семейство, .exe, .dll, .scr, и вы можете распознать их, открыв их в текстовом редакторе (например, в блокноте) и посмотрев, начинается ли файл с MZ, которыйявляются подписью для Марка Zbikowski.

Короче говоря, нет большой разницы в *.dll или *.exe, за исключением некоторых незначительных блоков, зависящих от версии. Короче говоря, вы делаете «dll» при компиляции. Но если вы хотите скомпилировать вашу программу точно как dll, это зависит от вашего компилятора:

  1. Если вы работаете в Visual Studio , у Microsoft есть несколько учебных пособийдля этого
  2. Для MinGW у вас есть в учебном коде
  3. А для CygWin у вас есть аргументы командной строки для компилятора
  4. и для Clang Я бы предложил этот вопрос

Но я был бы осторожен с развертываниемтакого файла, поскольку @Richard замечательно указал, что RunDll32 устарела, но он все еще используется в механизмах некоторых библиотек языков программирования. Поэтому, если вы создаете что-то для целей самопроверки, я бы порекомендовал эти 4 варианта в зависимости от вашего компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...