0

我有一个 .Net COM 服务器,它有一个将消息和延迟作为参数的方法。延迟之后,它会触发一个事件,将消息发送回客户端。

它适用于 .Net 和 VB6 客户端。

为了在 FoxPro 中绑定 COM 事件,您必须在 foxpro 中创建一个实现事件接口的类并将其连接起来,如下所述: http ://www.west-wind.com/presentations/dotnetfromVfp/ DotNetFromVfp_EventHandling.asp

我有这样一堂课:

DEFINE CLASS ComEventHandler AS session OLEPUBLIC
  IMPLEMENTS IComServerEvents IN "PcaTest.ComServer"
  * "C:\ComTest\PCATest.tlb"

  PROCEDURE IComServerEvents_TimerExpired(message AS STRING) AS VOID
  * add user code here
  ?message
  ENDPROC
ENDDEFINE

以及将其连接起来的代码:

loMM = CREATEOBJECT("PcaTest.ComServer")
loEvents = CREATEOBJECT("ComEventHandler")

EventHandler(lomm, loevents)

当我运行此代码时,我得到 Type Library PcaTest.ComServer not found。但是,如果我将 implements 行更改为:

IMPLEMENTS IComServerEvents IN "C:\ComTest\PCATest.tlb"

我无法硬编码 tlb 的位置。

实际上,"CREATEOBJECT("PcaTest.ComServer")" 行工作正常,如果我不尝试实例化 ComEventHandler 对象,则该 COM 对象将被实例化,我可以调用它的方法并访问它的属性。事件处理程序类(大部分)仅在我向它提供 .tlb 而不是 progId 时才起作用。

.Net COM 服务器在 GAC 中注册。我已经尝试过使用和不使用 /codebase 以及使用和不使用 /tlb 或 /tlb:filename.tlb 的 regasm

我确实有一次在测试中工作过,或者看起来是这样。我现在无法复制这些结果,但是当我让它工作时,我使用了 /codebase 和 /tlb:filename.tlb。

4

2 回答 2

0

我讨厌回答我自己的问题。再次。但我明白了。

答:在 GAC 中注册程序集时使用 regasm /codebase 使其无法工作。我的问题是,如果我在 GAC 中安装程序集之前进行了 regasm,它会起作用,但是如果程序集首先在 GAC 中注册,或者如果它在 GAC 中注册并且稍后调用 regasm,FoxPro 会得到使困惑。

在 FoxPro 中使用 .Net COM 服务器的事件绝对需要:

  • 为 COM(progId 和 ClsId)注册的程序集,可能是通过 regasm
  • regasm 上的 /codebase 标志将类似这样的内容添加到注册表中:

    [HKEY_CLASSES_ROOT\CLSID\{A2DA47BD-15E8-48E3-BA54-4B1CED2D3C01}\InprocServer32]
    @="mscoree.dll"
    "CodeBase"="file:///C:/MACsWave/PCATest/pcatest.dll"
    

    代码库是必需的,即使该程序集应该可以从 GAC 访问。例如,VB6 客户端不需要 /codebase

  • /tlb 标志注册类型库。/tlb:"文件名" 不是必需的。

因为使用了 /codebase 标志,所以不需要在 GAC 中注册程序集。

如果您确实将程序集添加到 GAC 并随后调用 regasm /codebase,您会在注册表中获得以下信息:

[HKEY_CLASSES_ROOT\CLSID\{A2DA47BD-15E8-48E3-BA54-4B1CED2D3C01}\InprocServer32]
@="mscoree.dll"
"CodeBase"="file:///C:/WINDOWS/assembly/GAC_32/PCATest/1.1.0.0__325ac2fec08eafa8/PCATest.dll"

我想知道 FoxPro 是否在与 dll 相同的目录中寻找 tlb 文件,但发现 GAC 中没有 .tlb。或者其他的东西...

无论如何,问题解决了。

于 2012-05-14T14:36:50.193 回答
0

您提到您无法对位置进行硬编码,我想知道您是否可以将其放入表格中,从表格中选择它,然后使用类似这样的内容

tlbLocation(包含路径的字段)

在 (tlbLocation) 中实现 IComServerEvents

我对我的一些应用程序做了类似的路径规范

于 2012-05-12T03:49:02.570 回答