вызов функции ac dll из клиента ac асинхронный? - PullRequest
3 голосов
/ 26 марта 2019

Я сделал простой cll только с одной функцией (в VS 2017). Я использую эту функцию DLL из другой клиентской программы c. Является ли вызов асинхронным (в отдельном потоке, чем выполняемая клиентская программа)? Если нет, то мне нужно запустить асинхронно, а если функция dll - длительный процесс (или когда она хочет уведомить вызывающую программу о событии), мне нужен вызов из dll в функцию обратного вызова в вызывающей (клиентской) программе управлять событием (я полагаю, с помощью указателя на функцию).

Код DLL:

#include <stdio.h>

__declspec(dllexport) void DllFunction() {
    for (long i = 1;i <= 300000;i++) {
        printf("dll\n");
    }

}

И клиентская программа c:

#include <stdio.h>
__declspec(dllimport) void DllFunction(void);

    int main() {
        DllFunction();
        for (long i = 1;i <= 300000;i++) {
            printf("client\n");
        }
        return 0;
    }

Запуск предыдущего клиентского кода Я думаю, что не было никаких помех между двумя командами printf (dll и клиент)!

Обновлено

обо всем по порядку ... после поиска я понимаю, что мы можем отделить функцию обратного вызова от асинхронного вызова. У нас может быть функция обратного вызова, которая находится в коде вызова (клиента) и вызывается из длительного процесса dll, чтобы уведомить, например, о прогрессе, как очень хорошо описано в этой статье: Использование обратных вызовов в DLL

так что остается второй проблемой асинхронности ... как насчет функции CreateThread (). Могу ли я использовать это? И если да, где должны быть использованы? В DLL или в коде клиента?

Ответы [ 2 ]

6 голосов
/ 26 марта 2019

Нет, вы можете рассматривать вызовы DLL как обычные вызовы функций.Ничего особенного не происходит только потому, что целевая функция живет в DLL.

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

Если вы хотите асинхронность, вам придется создавать ее самостоятельно, и выполнение набора функций, выполняемых в отдельной задаче / потоке, не очень просто.

0 голосов
/ 26 марта 2019

Я думаю, что нашел решение об асинхронности ... Я упомянул, что среда разработки - это Visual Studio 2017. Поэтому мы можем использовать функцию CreateTrhead ().Мы можем использовать его либо из кода клиента, если мы используем dll из платформы, поддерживающей многопоточность (например, Microsoft C, например, тестовую клиентскую программу в этом вопросе), либо вы можете использовать CreateThread в dll, если dll будет использоваться из сред, которыене может поддерживать многопоточность (как VBA).Для первой ситуации код:

DLL (такая же, как и раньше)

#include <stdio.h>

__declspec(dllexport) void DLLFunction() {
    for (long i = 1;i <= 300000;i++) {
        printf("dll\n");
    }
}

CLIENT (мы используем CreateThread () для вызова функции DLL)

#include <stdio.h>
#include <windows.h>

__declspec(dllimport) void DLLFunction();

DWORD WINAPI ThreadFunc(void* data) {
    DLLFunction();
    return 0;
}

int main() {

    HANDLE thread = CreateThread(NULL, 0, ThreadFunc, NULL, 0, NULL);

    for (long i = 1;i <= 300000;i++) {
        printf("client\n");
    }
    return 0;
}
...