将非 .NET DLL 添加到 ColdFusion

Posted

技术标签:

【中文标题】将非 .NET DLL 添加到 ColdFusion【英文标题】:Add non .NET DLL to ColdFusion 【发布时间】:2014-01-22 15:24:02 【问题描述】:

在向 ColdFusion 项目添加任何类型的 DLL 方面,我目前面临两难境地。我做了大量的研究,但似乎没有什么简单到可以理解。我有一个 Winform,它在 Reference 中使用相同的 DLL,这让生活变得轻松。当希望将相同的 DLL 添加到 ColdFusion 项目时,它似乎不起作用。我尝试过使用以下内容:

<cfobject type="com" name="myObj" assembly="C:\DocViewer\AxInterop.SHDocVw.dll">

这是我收到的错误消息:

标签 CFOBJECT 的属性验证错误。它有一个无效的 属性组合:程序集、名称、类型。

这个网站过去很有帮助,我希望了解 CF9 中的这个 DLL 是如何工作的,这样当当前的程序完美运行时,我就不必完全重写整个程序。

来自 cmets

我尝试使用 regsvr32 添加 DLL,但现在这是我的错误:

the module was loaded but the entry-point dllregisterserver was not found

【问题讨论】:

我认为您应该能够在 ColdFusion 中使用已注册的 COM 对象。您从该代码中得到什么错误消息?查看the documentation for COM objects,您似乎缺少必需的属性(类),并且 COM 对象(程序集)的属性不受支持。检查我包含的参考。 另外 - 您使用的是 32 位还是 64 位 CF? (64位下不支持COM。)另外,这个dll到底是做什么的? 您还需要向 Windows 注册 dll。从命令行运行这个来注册regsvr32 C:\DocViewer\AxInterop.SHDocVw.dll 这就是我的怀疑。阅读我提到的文档 (help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/…) 并使用适当的属性重试。最有可能至少classnameaction="create"type="COM"。然后请在这里报告您的发现。另外,请edit your question when giving additional information like error messages,因为它们比在这些 cmets 中更容易找到。 @clerktech - 此外,您还没有与我们分享这些 DLL 为您所做的事情。您提到过这些是存储在 SQL 服务器上的 PDF。我有硬代码让它工作,但需要 DLL 来完成循环,但我仍然不知道这意味着什么。正如我之前所说,ColdFusion 内置了对许多 PDF 功能的支持。那么你到底想用这些 PDF 做什么呢? 【参考方案1】:

在我看来,您将 cfobject 属性用于 .NET 对象而不是 COM 对象。 cfobject 标签是属性因操作/类型而异的标签之一,例如 cfcontent、cffile 和 cfdirectory(以及其他一些不会立即浮现在脑海中的标签)。

因此,您需要专门用于访问 COM 对象的文档,最新版本的 Adob​​e CFML 引擎位于此处:https://wikidocs.adobe.com/wiki/display/coldfusionen/cfobject%3A+COM+object

文档页面上有一个错字,但看起来这应该适合你(尽管我承认我已经有一段时间没有调用 COM 对象了):

<cfobject 
    type = "com"
    class = "path.to.com.Class" 
    name = "myObj"
    action = "create|connect">

如果您将action="connect" 作为 Windows 服务安装,您可能会使用它,或者如果您希望 CF 实例化 DLL,则可以使用 create,但我想将它作为服务安装会更容易。我只是猜测,但我认为“path.to.com.Class”将是服务的名称,如果您以这种方式使用它,或者如果 CF 服务器将是 .dll 文件的逻辑路径正在实例化它。如果这些选项都不起作用,那么如果将其移至较新的操作系统,则可能存在版本不兼容,或者服务可能配置错误。

注册 DLL 的错误消息听起来像是(我猜是因为我从未创建过 Windows 服务 DLL)它正在寻找 DLL 中的特定类或函数,以便在 Windows 中将其注册为服务并且它无法在 DLL 中找到那个“入口点”(即,与 Java 将寻找“public static void Main(String args)”作为 Java 程序的入口点的方式相同)。这对于服务可能是必需的,但对于可能以其他方式访问和使用的通用 DLL 可能不是必需的,因此该 DLL 可能工作,但与服务注册不兼容。

所以回到你的示例代码,这可能有效:

<cfobject type="com" name="myObj" action="create" 
    class="C:\DocViewer\AxInterop.SHDocVw.dll">

【讨论】:

class 在 COM 上下文中应该是 ProgID,而不是 dll 的路径。 我说我在猜测。我现在注意到 cmets 中已经提到了文档。我没有阅读它们,因为我希望答案会发布在答案中,而不是 cmets 中。 “我没有阅读它们,因为...” 那么你需要(a)调整你的期望,并且(b)开始阅读 cmets 无论如何因为它们通常包含/要求对与任何即将回答的人相关的问题进行澄清。 “调整你的期望” 我的期望应该与网站创建者的期望不同,答案是他们想要的答案而不是 cmets?我应该期望程序员不会阅读技术网站上的说明并滥用工具?

以上是关于将非 .NET DLL 添加到 ColdFusion的主要内容,如果未能解决你的问题,请参考以下文章

将非托管 DLL 部署到输出目录

如何将非托管 C++ 表单嵌入到 .NET 应用程序中?

如何将非托管库引用添加到 NUnit 测试

如何将非托管 dll 和托管程序集合并到一个文件中?

将非托管 dll 的 Delphi 代码转换为 C#

将 DLL 引用添加到 C# asp.net 项目后如何调用函数