Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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
在Delphi源代码库中进行的更改,以便在windows中注册时将生成的.dll识别为不同的dll_Delphi_Dll_Com - Fatal编程技术网

在Delphi源代码库中进行的更改,以便在windows中注册时将生成的.dll识别为不同的dll

在Delphi源代码库中进行的更改,以便在windows中注册时将生成的.dll识别为不同的dll,delphi,dll,com,Delphi,Dll,Com,我在delphi中有一个开源电气解算器(OpenDSS)的源代码 通常,在安装OpenDSS时,引擎注册为COM组件 我想编译引擎8次,生成8个内部完全相同的不同dll。为什么?因为我想同时使用8个单核解算器来执行蒙特卡罗模拟 问题是,只要重命名dll并注册它们,windows就可以将它们识别为相同的COM组件。所以问题是,;我应该在源代码中做什么更改,以便在编译库时欺骗windows 我希望你的问题足够清楚,并提前感谢你。天真地说,你的问题的答案是,除了有不同的CLSID外,还要制作八个不同版

我在delphi中有一个开源电气解算器(OpenDSS)的源代码 通常,在安装OpenDSS时,引擎注册为COM组件

我想编译引擎8次,生成8个内部完全相同的不同dll。为什么?因为我想同时使用8个单核解算器来执行蒙特卡罗模拟

问题是,只要重命名dll并注册它们,windows就可以将它们识别为相同的COM组件。所以问题是,;我应该在源代码中做什么更改,以便在编译库时欺骗windows


我希望你的问题足够清楚,并提前感谢你。

天真地说,你的问题的答案是,除了有不同的CLSID外,还要制作八个不同版本的代码,它们是相同的。保持暴露接口的所有IID相同,但更改CLSID。这允许您使用不同的CLSID注册八个不同的COM服务器来识别它们。但是您从创建的每个COM对象请求相同的IID

不过,这是一个相当卑鄙的解决方案。它的伸缩性不太好。它的内存很昂贵。这真是太笨拙了。使代码线程安全肯定是可能的。通常这可以通过定位全局变量并处理它们来实现。通常通过将它们转换为参数或状态


如果您无法管理它,那么您可以创建一个存根可执行文件,以允许服务器耗尽进程。然后实例化进程外服务器的单独实例

这是一个相当奇怪的问题。更好的解决方案是确保组件是线程安全的。一个不太好的解决方案是运行多个进程而不是多个线程。您可以使用reg free COM加载DLL的8个不同副本。但是,您的问题的答案是,您需要更改8个副本中每个副本的CLSID。这是一个非常可怕的解决方案。你不能找到一个更好的解决方案吗?好吧,我完全同意你的观点,最好的办法是使解算器线程安全,但是,它是遗留代码,进行这样的更改需要深入了解源代码。所以我想出了一个奇怪的解决方案。仅仅删除所有的全局变量并使它们成为参数就足够了。通常不需要深刻的理解。我曾经用这种方式制作了Fortran ARPACK代码的线程安全版本。