可以调用操作系统的命令来获取CPU序列号。例如在Cache' for Windows上,可以执行:
SAMPLES>s args=3
SAMPLES>s args(1)="CPU"
SAMPLES>s args(2)="get"
SAMPLES>s args(3)="ProcessorID"
SAMPLES>d $ZF(-100,"","wmic",.args)
ProcessorId
0FABFBFF000506EX
0FABFBFF000006EX
0FABFBFF000006EX
0FABFBFF000006EX

如果dll重新编译过,那么是需要重新生成代理类的;其它情况下并不需要。另外,Ensemble 2016里有.net 网关,通过Studio来建立dll代理类。不过它依然需要在dll代码发生变化时重新生成代理类。

这也是后续版本(尤其是InterSystems IRIS)推出动态对象网关的原因:通过动态网关就不用生成代理类了,从而避免因为.net/java端发生代码变更而需要重新生成代理类。

$ZF()对DLL没有特殊要求。

在Ensemble 2016中,使用$ZF(-4)来操作DLL是Caché的Callout网关的底层实现之一。这种方式比较通用。
当然,如果这些DLL(ActiveX/COM)注册在Ensemble服务器上(Windows服务器),还有别的调用方式:使用Caché Activate 网关,用Studio来产生这些DLL的代理类,然后您就可以像使用Ensemble/Caché类一样使用这些DLL里的方法了。

我想您的问题涉及3个方面:
1. 如何以SQL访问Ensemble的数据:
Ensemble的数据可以通过SQL操作。因此第三方SQL数据库可以直接将Ensemble作为一个SQL数据库,通过XDBC访问Ensemble,并使用SQL获取数据。
同样,Ensemble也可以通过link table直接操作第三方SQL数据库。
2. 如何发现数据在第三方数据库不存在?
这需要一些逻辑,例如通过时间戳、自增的ID等信息判断。
3. 批量快读:
听起来,不是要实时进行数据同步,而是要批量处理。批量处理可以使用多种方式:a. 小批量可以通过SQL输出适配器;b. 大批量可以绕过适配器/Production,直接以link table或其它方式处理,这样不需要产生消息,效率更高。

系统类%Library.GTWCatalog有一个类查询SQLDataSources用来获取DSN,例如:

ClassMethod Test()
{
    set rs=##class(%ResultSet).%New()
    set rs.ClassName="%Library.GTWCatalog"
    set rs.QueryName="SQLDataSources"
    set sc=rs.Execute(1)  
    If $$$ISERR(sc) Do DisplayError^%apiOBJ(sc) Quit
    while rs.%Next() { do rs.%Print() }
}