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