当我试图链接到DLL文件中的函数时,我遇到了访问冲突。DLL是在 Delphi 6中制作的,我们正在升级到Delphi 11(我知道野生跳转)。因此,代码曾经工作过,在 Delphi 的许多变化中的某个地方已经崩溃了。 Delphi 环境在Windows 10计算机上运行。使用的DLL已经在 Delphi 11中编译和构建(尽管组件已经更改)。 Delphi 声称它可以编译和构建,如果这是这个问题可能存在的地方,我可以得到更多的代码,因为我有DLL的源代码(和项目文件)。
procedure TForm1.Button1Click(Sender: TObject);
type
TShowUserList = function : TForm; stdcall;
var
LHandle: THandle;
LUserList : TShowUserList;
LForm : TForm;
begin
LHandle := LoadLibrary('E:\D11 Projects\Test Dll\Win32\Debug\BOUsers.Dll');
if LHandle <> 0 then
begin
@LUserList := GetProcAddress(LHandle, 'ShowUserList');
if @LUserList <> nil then
begin
LForm := LUserList; //Here is where error shows, doesn't even get to the ShowUserList function
end;
end;
end;
在调试时,当我到达LForm := LUserList
时,LUserList
是一个“不可访问的值”。这就解释了为什么会出现错误。
在BOUsers.dll中有一个UserList表单,
FUNCTION ShowUserList : TForm;
BEGIN
IF NOT G.FormExists('UsersListForm') THEN
BEGIN
UsersListForm := TUsersListForm.Create(Application);
Result := UsersListForm;
END
ELSE
Result := G.ReturnForm('UsersListForm');
END;
EXPORTS
ShowUserList;
调试甚至不会在这里输入(我已经确保为dll启用了调试,尽管默认情况下似乎是这样)。如果我能进入这段代码并进行调试,我会稍微高兴一点!
我知道没有全部的错误处理(不是说D 6版本有很多)。然而,这只是一个测试项目,以帮助找出问题的主要应用程序,我可以添加它,如果需要虽然。
我的期望是LForm
将是dll中的UserListForm
,我将能够在窗口窗格中显示它,调试它的问题并按预期使用它。
我试着在StackOverflow上浏览过各种类似的问题(如果我错过了一个,请随意链接,我会浏览它)。复制embarcadero提供的示例。
老实说,在过去的应用程序基本上都是exe内的单位和形式之前,我没有使用过DLL。
1条答案
按热度按时间2izufjch1#
你没提过但你在哪个操作系统上运行这个有机会赢XP吗?您正在尝试将应用程序迁移到Win 10或11吗?
我问这个问题是因为我不确定D11是否能在Win XP中运行,所以如果你能从最新版本的 Delphi (D11)中编写的代码访问D 6中创建的DLL,我会感到非常惊讶。
我认为你最好的办法是得到DLL的源代码,并首先在D11中重建它。除此之外,如果它来自第三方供应商,请考虑获得更新的版本。
如果您没有源代码,那么除了重写它或用等效的库替换它之外,我不知道该建议什么。(在过去的20年里,肯定有人写过类似的东西!)
在我的上一份工作中,我的任务是将 Delphi 应用程序从XP迁移到Win Server 2016。他们认为这将是一个简单的重新编译,但没有工作,因为DLL不会运行在Win10。无论如何,我们都不遵守供应商的许可条款,供应商想收取我们一个更新的解决方案的费用。我最终建议我们用 Delphi 本地编写的组件库来替换DLL,这样最终完成任务的成本更低,速度更快。
已添加(根据您的以下请求):您并没有要求这一点,但是由于您有源代码,您可以考虑通过使用本地托管的REST服务(即在您的内部网中)将这些DLL转换为微服务来重构。这对于时间不成问题的事情非常有用,并且可以简化对其他机器的部署(如果需要的话),而这些机器需要更多的关注DLL。有很多库可以用来用 Delphi 构建服务;我喜欢TMS XData。有几个在线课程,他们出售,带你一步一步地通过这个过程。(这是他们的Biz Components lib的一部分。)除非您从DLL返回PODO(不太可能),否则将它们迁移到微服务架构应该非常简单。