【问题标题】:regsvr32 fails for simple freepascal COM dllregsvr32 对于简单的 freepascal COM dll 失败
【发布时间】:2015-01-15 21:40:28
【问题描述】:

我对 free-pascal 完全陌生,我尝试实现一个应该注册 COM 类的简单 dll。 不幸的是,我只能找到关于COM Programming for freepascal 的少量信息。因此,我希望这里有人可以给我一些提示,甚至是一些示例的链接。

这就是我所做的:

  • 我的操作系统是 Windows 7 64 位
  • 下载安装 Lazarus 32bit 版本
    • 版本号:1.2.6
    • 日期:2014-10-11
    • FPC:版本 2.6.4
    • SVN 修订:46529
    • i386-win32-win32/win64
  • 在 Lazarus 中安装了 ActiveX 包
  • 创建了一个新项目 - 键入 Library 并使用简单的 TAutoObject 和默认的 TAutoObjectFactory 用于 COM 注册:此说明后包含源代码
  • 构建 dll
  • 使用 regsvr32.exe 注册我的 dll --> 这失败了

    "确保二进制文件存储在指定路径..."
    对内存位置的访问无效。

  • 然后我尝试更改默认项目选项:
    在 Compiler Options - Config and Target 下,我设置了
    • 目标操作系统:Win32
    • 目标 CPU 系列:i386
  • 还是出现同样的错误
项目来源
library LazarusSimpleComRegTest;

{$mode objfpc}{$H+}

uses
  Classes,
  { you can add units after this }
  ComServ, MyComObj;

exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer;

end.           

MyComObj单位:

unit MyComObj;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, ComObj;

const
  CLASS_Plugin: TGUID = '{5E020FB0-B593-4ADF-9288-801C2FD432CF}';

type
  TPlugin = class(TAutoObject)

  end;

implementation

uses ComServ;

initialization
  TAutoObjectFactory.Create(ComServer, TPlugin, CLASS_Plugin,
    ciMultiInstance, tmApartment);

end.

【问题讨论】:

  • 您是否以管理员权限运行命令提示符?
  • 是的 - 我有管理员权限
  • 您声明了 4 个必需的 COM 服务器导出,但您没有编写它们。它不是自动的。谷歌“freepascal dllregisterserver”查找示例代码,like this。
  • 这些方法在 ComServ 中实现,我包含在我的使用列表中(我不确定 ComServ 是标准 free-pascal 还是 ActiveX 包的一部分) - 所以它们应该出口,对吧?
  • 还有:如果函数不存在,我什至无法构建 dll。

标签: dll com freepascal regsvr32


【解决方案1】:

我认为主要问题是,我没有将类型库作为资源包含在我的 dll 文件中:现在它可以正常工作了。

我在 git-hub 上制作了一个非常基本且简单的工作示例,其中包含一些基本文档: lazarus-com-example

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 2011-05-11
    • 2010-09-27
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 2016-06-28
    相关资源
    最近更新 更多