Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从c客户机调用c dll函数是异步的吗?_C_Dll_Visual Studio 2017 - Fatal编程技术网

从c客户机调用c dll函数是异步的吗?

从c客户机调用c dll函数是异步的吗?,c,dll,visual-studio-2017,C,Dll,Visual Studio 2017,我制作了一个简单的c dll,只有一个函数(在VS2017中)。我使用另一个c客户端程序中的dll函数。调用是否异步(在调用客户端程序运行之外的单独线程中)?如果不是,那么我需要异步运行,如果dll函数是一个长时间进程(或者当它想要通知调用程序某个事件时),我需要从dll调用调用(客户机)程序中的回调函数来管理事件(我假设使用函数指针) dll代码为: #include <stdio.h> __declspec(dllexport) void DllFunction() {

我制作了一个简单的c dll,只有一个函数(在VS2017中)。我使用另一个c客户端程序中的dll函数。调用是否异步(在调用客户端程序运行之外的单独线程中)?如果不是,那么我需要异步运行,如果dll函数是一个长时间进程(或者当它想要通知调用程序某个事件时),我需要从dll调用调用(客户机)程序中的回调函数来管理事件(我假设使用函数指针)

dll代码为:

#include <stdio.h>

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

}
#包括
__declspec(dllexport)void DllFunction(){

对于(long i=1;iNo),您可以将DLL调用视为普通函数调用。仅仅因为目标函数恰好位于DLL中,就没有什么特别的事情发生

在实践中,可能会有一个间接表或其他东西,因此可能会有一个额外的跳转,但本质上仍然是直接跳转到代码,就像程序中的任何其他函数调用一样


如果你想要异步,你必须自己构建它,让一组函数在一个单独的任务/线程中运行并不是非常简单。

我想我已经找到了一个关于异步的解决方案。。。 我已经提到,开发环境是Visual Studio 2017。因此,我们可以使用CreateTrhead()函数。如果我们使用支持线程的平台上的dll(例如Microsoft C,如本问题中的测试客户端程序),则可以从客户端代码中使用该函数或者,如果dll将在不支持多线程(如VBA)的环境中使用,则可以在dll中使用CreateThread。 对于第一种情况,代码为:

DLL(与以前相同)

#包括
__declspec(dllexport)void DLLFunction(){

对于(long i=1;i不,除非您这样做,否则它不是异步的。C对线程或异步的事情一无所知。我已经更新了我的问题…我将回调功能与异步功能分离,因为它们可以独立共存确定…我通知了它,并希望得到确认…谢谢…但您能建议我应该做的几点吗了解这一点吗?@非线性注意内存管理。例如,在dll中执行
malloc
,并在调用代码中释放它可能会给您带来麻烦,这个主题非常广泛。
#include <stdio.h>
__declspec(dllimport) void DllFunction(void);

    int main() {
        DllFunction();
        for (long i = 1;i <= 300000;i++) {
            printf("client\n");
        }
        return 0;
    }
#include <stdio.h>

__declspec(dllexport) void DLLFunction() {
    for (long i = 1;i <= 300000;i++) {
        printf("dll\n");
    }
}
#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;
}