当尝试通过我们的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以查找相关内容。
但我想检查一下我是否应该做其他事情。
目前我们还不知道如何解决它。因此,任何帮助或相关信息都将受到赞赏。
感谢您的帮助。