如何通过Delphi 7程序访问已注册的COM inetrop DLL?

时间:2014-06-30 12:13:43

标签: c# vb.net delphi dll com-interop

当尝试通过我们的Delphi 7程序与Com interop DLL服务进行通信时,我们似乎遇到了问题。但VB和C#中的所有其他测试程序似乎都没问题。

请在下面找到具体的技术细节:

a)我们有一个VB.net类库项目,它引用已安装的DLL并生成COM互操作DLL。在特定构造函数下,创建一个新的应用程序实例。请参阅下面的VB.net示例代码:

Public Sub New()

    CreateLog()        

    Try
        sw.WriteLine(Now() & " " & "Creating Sage.Accounting.Application")
        oApplication = New Sage.Accounting.Application()
        sw.WriteLine(Now() & " " & "Completing Sage.Accounting.Application")
    Catch ex As Exception
        sw.WriteLine(Now() & " " & "Exception-" & ex.Message)
    End Try

End Sub

在上述项目成功构建之后,将生成COM操作DLL和类型库文件(Sage_200V9.0_Lib .dll和.tlb文件)。还生成相应的日志文件项。

b)我通过在示例C#和VB.net测试项目中引用它来测试上面生成的.dll,其中按钮事件将创建应用程序实例。通过生成的调试和调试日志确认了这一点。见下面的代码:

Public Class Form1
Private SAGELib As Sage_200V90_Lib.Sage_200V90_Lib

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    SAGELib = New Sage_200V90_Lib.Sage_200V90_Lib
End Sub

结束班

c)现在.dll和.tlb文件被移动到delphi程序的输出目录。导入.tlb文件以生成Sage_200V9_0_Lib_TLB.pas。请参阅以下示例代码以创建COM对象实例:

CoSage_200V90_Lib = class
class function Create: _Sage_200V90_Lib;    
end;

class function CoSage_200V90_Lib.Create: _Sage_200V90_Lib;
begin
 Result := CreateComObject(CLASS_Sage_200V90_Lib) as _Sage_200V90_Lib;
end;

d)运行引用上述单元的delphi程序,通过按钮事件调用create函数,如下所示:

oMMSV9  : _Sage_200V90_Lib; // MMS V9 Object
oMMSV9   := CoSage_200V90_Lib.Create;

它进入创建的TLB单元,它进入VB.net的项目构造函数。但是当尝试创建一个新的应用程序实例,即#S; New Sage.Accounting.Application()"时,delphi程序就会挂起。

e)我通过检查日志项(如a中所述)确认这进入了VB.net项目构造函数,它只有以下内容: " 30/06/2014 12:15:33创建Sage.Accounting.Application " 但没有"完成Sage.Accounting.Applications"日志项目。也没有例外。

f)我尝试的其他测试如下: 我使用以下脚本取消注册并重新注册DLL:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm C:\DELPHDEV7\EXE\Sage_200V9.0_Lib.dll /unregister /silent

C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm "C:\DELPHDEV7\EXE\Sage_200V9.0_Lib.dll"

两个脚本似乎都成功完成了取消注册/注册操作。

g)我试过的另一个测试是将VB.net生成的文件放在VB.net调试文件夹中。导入TLB文件并运行delphi程序仍然存在同样的问题,其中出现以下错误:

Project ..exe faulted with message: 'access violation at 0x77deb72e: write of address 0x00090e54'. Process Stopped. Use Step or Run to continue.

我还能通过尝试构建b)中提到的测试项目来确认delphi程序正在使用特定的dll并且它错误地说:

Error   4   Unable to copy file "obj\Debug\Sage_200V9.0_Lib.dll" to "bin\Debug\Sage_200V9.0_Lib.dll". The process cannot access the file 'bin\Debug\Sage_200V9.0_Lib.dll' because it is being used by another process.  Sage_200V9.0_Lib

" h)我也尝试使用以下脚本单独生成TLB文件

C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm C:\DELPHDEV7\EXE\Sage_200V9.0_Lib.dll /tlb:C:\DELPHDEV7\EXE\Sage_200V9.0_Lib.tlb

导入此TLB文件并运行delphi程序仍然存在同样的问题。

i)a)中提到的已安装的DLL基本上与SAGE相关的DLL如下:

Sage.Accounting.Common.dll,
Sage.Accounting.Common.PersistentObjects.dll,
Sage.Accounting.Financials.dll,
Sage.Accounting.PersistentObjects.dll,
Sage.Common.dll,
Sage.ObjectStore.dll,
Sage.Utils.dll,

对于VB.net项目,上述引用来自我的GAC。我也尝试在本地位置复制上面的DLL。但两种情况都会出现同样的问题。

k)COM类的附加信息如下: 在VB.net项目中:

  <ComClass(Sage_200V90_Lib.ClassId, Sage_200V90_Lib.InterfaceId, Sage_200V90_Lib.EventsId)> _
Public Class Sage_200V90_Lib

#Region "COM GUIDs"    
Public Const ClassId As String = "d1e254d1-37f0-481a-bc4a-0fce7d99e8cb"
Public Const InterfaceId As String = "0e9d9839-ecf1-47da-a4d0-9522f8c7c7bb"
Public Const EventsId As String = "f6a7099c-13df-4c81-ab84-0f4093d90409"
#End Region

特定的TLB.pas文件具有以下特定ID:

IID__Sage_200V90_Lib: TGUID = '{0E9D9839-ECF1-47DA-A4D0-9522F8C7C7BB}';
CLASS_Sage_200V90_Lib: TGUID = '{D1E254D1-37F0-481A-BC4A-0FCE7D99E8CB}';

似乎阻止了delphi程序创建新的应用程序实例。

我目前正在尝试注册COM互操作DLL的不同方法,并制作项目的C#版本以生成COM互操作DLL。我还将继续查看stackoverflow以查找相关内容。

但我想检查一下我是否应该做其他事情。

目前我们还不知道如何解决它。因此,任何帮助或相关信息都将受到赞赏。

感谢您的帮助。

0 个答案:

没有答案