开发环境
Window 10
Visual Studio 2026 c++
准备工作
| 类别 | 具体内容 | 说明 |
|---|---|---|
| 开发工具 | Visual Studio 2017及以上版本(本例使用的2022版) | 支持C++ DLL项目编译,兼容通达信DLL开发规范 |
| 参考资料 | 《通达信DLL函数编程规范》 | 通达信官网下载,包含接口定义、工程模板、开发要求 |
| 测试环境 | 通达信客户端(对应32/64位版本) | 用于测试编译后的DLL功能有效性 |
开始编写前请做好准备工作,去通达信官网下载《通达信DLL函数编程规范》,下载地址是:
通达信帮助中心
解压,你会得到
创建项目(创建DLL项目)
通达信插件是以动态库(DLL)方式插入的,因此需要创建一个动态库项目

项目创建好了以后把压缩包“通达信DLL函数编程规范.rar”中的“PluginTCalcFunc.h”拷贝到项目文件夹中,编写通达信插件只需要这个头文件,头文件的内容如下:
实现插件
通达信DLL函数编程规范文件说明:
TestPluginTCale.cpp:DLL入口点
PluginTCalcFunc.h:导出函数声明
TCalcFuncSets.h
TCalcFuncSets.cpp:定义导出函数
step 1.添加2个函数
src/DemoPlugin/dllmain.cpp
void TestPlugin1(int DataLen,float* pfOUT,float* pfINa,float* pfINb,float* pfINc)
{
for(int i=0;i<DataLen;i++)
pfOUT[i]=i;
}
void TestPlugin2(int DataLen,float* pfOUT,float* pfINa,float* pfINb,float* pfINc)
{
for(int i=0;i<DataLen;i++)
{
pfOUT[i]=pfINa[i]+pfINb[i]+pfINc[i];
pfOUT[i]=pfOUT[i]/3;
}
}
step 2.实现核心数据接口 (TCalcFuncInfo)
通达信通过一个结构体数组来识别 DLL 中有哪些函数可用。
g_CalcFuncSets[]: 这是一个全局数组,起到了“菜单”的作用。
{1, (pPluginFUNC)&TestPlugin1}:表示将 TestPlugin1 函数注册为 DLL 中的 1号函数。在通达信公式里调用 TDXDLL1(1, ...) 就会执行它。
{0, NULL}:这是终止符号,告诉通达信“菜单到此结束”,防止程序继续读取越界内存。
实现 TCalcFuncSet 导出函数
// step 2. 将函数注册到 DLL中
PluginTCalcFuncInfo g_CalcFuncSets[] =
{
{1, (pPluginFUNC)&TestPlugin1},
{2, (pPluginFUNC)&TestPlugin2},
{0, NULL},
};
/*
通达信通过一个结构体数组来识别 DLL 中有哪些函数可用。
g_CalcFuncSets[]: 这是一个全局数组,起到了“菜单”的作用。
{1, (pPluginFUNC)&TestPlugin1}:表示将 TestPlugin1 函数注册为 DLL 中的 1号函数。在通达信公式里调用 TDXDLL1(1, ...) 就会执行它。
{0, NULL}:这是终止符号,告诉通达信“菜单到此结束”,防止程序继续读取越界内存。
使用方法
暴露某个函数给通达信主程序,只需要在全局数组“g_CalcFuncSets”中添加一项即可。每项包含一个函数编号和对应的函数地址。
*/step 3. 注册机制 (RegisterTdxFunc)-导出注册函数
//导出给TCalc的注册函数
BOOL RegisterTdxFunc(PluginTCalcFuncInfo** pFun)
{
if (*pFun == NULL)
{
// 将函数列表的指针传给通达信
(*pFun) = g_CalcFuncSets;
return TRUE;
}
return FALSE;
}
/*
这是整个 DLL 的入口点.
当在通达信“公式管理器”中点击“绑定 DLL”并选择该文件时,通达信会寻找并调用 RegisterTdxFunc.
它将内部定义的 g_CalcFuncSets 地址传递给通达信主程序,从而完成函数的挂载。
*/
项目编译设置
配置类型:

“配置属性 -> 常规 -> 配置类型”为“动态库(.dll)”
点击Visual Studio菜单“生成->生成解决方案”编译插件,编译时目标平台选择x64,因为通达信软件是64位的。
Note
2024 年 7 月前,通达信仅支持 32 位 DLL;
目前已支持 64 位 DLL,需确保 DLL 位数与通达信客户端版本完全匹配(32 位对应 32 位、64 位对应 64 位
平台配置:

项目 -> 鼠标右击【属性】

常规 -> 调试信息格式 -> 【程序数据库】

代码生成 -> 启用最小重新生成【否】 - 启用函数级链接【是】
字符集:

右键项目 -> 属性 -> 配置属性 -> 高级 -> 字符集,选择“使用多字节字符集”
C++标准:

配置属性 -> C/C++ -> 语言 -> C++标准,选择ISO C++17或更低版本(保证兼容性)
编译插件
点击Visual Studio菜单“生成->生成解决方案”编译插件
output
重新生成开始于 上午1:10...
1>------ 已启动全部重新生成: 项目: DemoPlugin, 配置: Debug x64 ------
1> pch.cpp
1> dllmain.cpp
1>F:\stock\TdxDllCcpluscplus\src\DemoPlugin\dllmain.cpp(26,20): warning C4244: “=”: 从“int”转换到“float”,可能丢失数据
1> (编译源文件“/dllmain.cpp”)
1> DemoPlugin.vcxproj -> F:\stock\TdxDllCcpluscplus\x64\Debug\DemoPlugin.dll
========== 全部重新生成: 1 成功,0 失败,0 已跳过 ==========
========== 重新生成 于 上午1:10 完成,耗时 09.497 秒 ==========
将生成的 .dll 文件放入通达信安装目录下的 T0002/dlls/ 文件夹中
打开Debug文件夹,把 dll 文件 复制到通达信 D:\Thirdprogram\newtdx773_64\T0002\dlls 目录里
D:\Thirdprogram\newtdx773_64\T0002\dlls

若 DLL 存在依赖文件(如其他辅助 DLL、配置文件),需一并复制。
useful links
blog
使用C++编写通达信公式插件
http://www.xiaoyunyun.net/index.php/archives/53.html
32位编译设置
https://zhuanlan.zhihu.com/p/569819868
https://zhuanlan.zhihu.com/p/1991081822759719157
https://zhuanlan.zhihu.com/p/1898341945929082053
