Fluent UDF中动态调用动态链接库dll

Fluent用户经常会遇到UDF中需要调用已经写好的动态链接库dll,从而拓展UDF功能。一般来说,调用dll可以分为静态调用和动态调用。前者通常需要编译器版本一致,通用性不是非常高,而动态调用则是利用API函数LoadLibrary在需要读取dll中函数前动态加载,更加灵活方便或不受编译器版本限制。

我们知道,Fluent自带传统编译方式只能使用纯C语言,无法实现对API函数的调用。想要实现对API函数的调用就只能依靠第三方工具,比如VC++ UDF Studio插件。下面就以VC++ UDF Studio插件为例,讲解如何在UDF中动态调用已经写好的dll中的函数。

1. 首先,我们安装好Visual Studio,VC++UdfStudio插件(https://vcudfstudio.github.io)和Fluent,具体可以参考博客文章《利用VC++UdfStudio插件免配置环境直接编译UDF》(https://www.cnblogs.com/SuperUDF/articles/15832910.html)。

2. 然后,我们自己先写个dll来作为被调用的例子。新建一个dll工程项目,如下。

 

 

3. 双击树形表中的AddInDll.cpp文件编辑其源码,如下如下语句。

extern "C" __declspec(dllexport)int add(int a, int b)
{
    return a+b;
}

其中,__declspec(dllexport)表示后面跟的是需要从dll导出供给其它程序调用的函数。extern "C"表示以C规则命名导出函数,即保持add的名字不变。这样,后面才能直接用add函数名找到dll中的对应函数地址。否则add函数名会被重新改名成其它复杂名字,不太方便查找。

4. 在64位机器上,将编译平台改为“Release——x64”。然后就可以编译成dll。

 

 可以看到在项目文件夹的Release目录中已经生成了AddInDll.dll,这个就是我们需要在UDF中调用的目标dll了。

 

 5. 启动桌面的VC++UdfStudio插件图标,选择需要版本后会自动启动Fluent,读入case后点击Fluent嵌入菜单中的“Start Visual Studio”子菜单。

 

6. 在udf_source.cpp文件中输入如下示例源代码,并点击“编译UDF”按钮直到编译通过。有任何错误提示,可以双击提示行直接定位到源码中的错误行。编译通过后按“UDF库加载到Fluent”按钮即可载入到Fluent中。

#include "udf.h"

DEFINE_ON_DEMAND(testDll)
{
    HINSTANCE hDll = LoadLibrary("D:\\AddInDll\\x64\\Release\\AddInDll.dll");//写dll的全路径,根据dll所在实际位置更改
    typedef int(*ADDPROC)(int a, int b); //定义函数指针类型 
    ADDPROC addfun = (ADDPROC)GetProcAddress(hDll, "add"); //获取导出函数add的地址
    if (NULL == addfun) //不能找到导出函数add的地址
    {
        Message("Can't find the address of add function.\n");
    }
    else //可以找到导出函数add的地址
    {
        Message("Calculate using add function in DLL, 5+3=%d", addfun(5, 3));
    }
}

 

 7. 执行DEFINE宏,本例由于调用dll函数放在DEFINE_ON_DEMAND宏中,所以在Execute On Demand对话框里面手动执行。

  

 

 8. 运行结果如下,结果是正确的。

 

posted @ 2022-11-04 21:19  SuperUDF  阅读(630)  评论(0)    收藏  举报