Delphi 创建共享内存时出错

Delphi 创建共享内存时出错,delphi,Delphi,我必须调试一个使用Delphi CodeGear 2009构建的应用程序,该应用程序是由我以外的其他人构建的,此人不再是公司的一部分 奇怪的问题是,当我将项目加载到code gear并运行实际运行的软件时,我得到一个错误: 第一次机会例外价格为753CB9BC美元。异常类异常与 消息“创建共享内存时出错” 全球\{B40FBC0C-FEBD-11DD-B3EA-FC6656D89593}(5)”。过程 OrderCenter.exe(836268) 我甚至不能一步一步地运行软件,这似乎是在我进入

我必须调试一个使用Delphi CodeGear 2009构建的应用程序,该应用程序是由我以外的其他人构建的,此人不再是公司的一部分

奇怪的问题是,当我将项目加载到code gear并运行实际运行的软件时,我得到一个错误:

第一次机会例外价格为753CB9BC美元。异常类异常与 消息“创建共享内存时出错” 全球\{B40FBC0C-FEBD-11DD-B3EA-FC6656D89593}(5)”。过程 OrderCenter.exe(836268)

我甚至不能一步一步地运行软件,这似乎是在我进入ran应用程序之前发生的。我完全不知道如何修复这个错误,我当然可以查看代码并理解它,也许还可以修改它,但如果没有google上的任何文档,我肯定根本不知道如何修复这样的错误。我试着浏览谷歌,所以有一段时间我尝试了各种各样的关键词组合,但结果一无所获

我如何调试这个?我从哪里开始找


编辑#1

澄清一下,我甚至在进入应用程序之前就遇到了一个异常,它甚至不可调试。我很乐意尽快粘贴一个堆栈跟踪,这样每个人都可以看到它崩溃的地方。为最初没有想到这一点表示歉意

我在谷歌上搜索了确切的错误信息,但没有找到任何有用的信息。这里有几个例子:


编辑#2

感谢您花时间指定存在某种初始化过程的人员,我搜索了所有文件,找到了该过程,发现代码在此崩溃:

if not AlreadyRunning(ProcessName, TFormMain, False, False, True) then
如果我试着看一下这段代码的声明,它似乎确实试图创建一个全局共享内存对象,可能是某种互斥,以防止双重初始化

我的第一个猜测是,除了用户现在能够运行2+个相同的应用程序之外,我可能可以直接抛弃这部分代码而不产生任何后果

另一方面,我想知道为什么这会失败(Win7,管理员帐户)


PS:我无法找到最初发生错误的位置的原因是因为应用程序处于发布模式而不是调试模式,我花了一些时间和深入的UI搜索才在文件管理器的构建配置下注意到它。在我尝试在应用程序的初始化部分设置断点之前,没有任何其他迹象表明我处于发布模式,并且它不会停止…

错误是由您的程序专门引发的。从这条信息中可以看出:

异常类异常,消息为“创建共享内存全局时出错\{B40FBC0C-FEBD-11DD-B3EA-FC6656D89593}(5)

它具有Delphi程序引发的异常的所有特征。十六进制由
$
表示,而不是
0x
,消息的第一个字是标准的Delphi。我将假设是您的程序引发了此异常

首先,异常类是
exception
。就我所知,RTL或任何著名的第三方库中没有任何内容会引发类异常
异常
。这被认为是不好的做法。始终引发一个子类
异常
。因此,应用程序的代码会引发此异常

其次,该消息描述了创建共享内存时的错误,并在
Global
命名空间中给出了一个命名对象。这可能是一个命名的文件映射对象

最后,该消息包含一个Win32错误代码,通过调用
GetLastError
检索。密码是5号,我们的老朋友

因此,这个程序似乎与一个单独的进程同时运行,并且使用共享内存(文件映射)影响通信。无论出于何种原因,该文件映射的安全性都没有正确设置

该对象已被放置在
全局
命名空间中,如果需要在会话之间共享该对象,您可以这样做。因此,另一个进程驻留在会话0中的服务中似乎是合理的。可能尚未正确指定为跨会话访问保护对象所需的安全属性

引发异常的代码看起来有点像这样:

FileMapping := OpenFileMapping(FILE_MAP_READ or FILE_MAP_WRITE, 
  False, PChar(FileMappingName));
if FileMapping=0 then
  raise Exception.CreateFormat(
    'Error creating shared memory %s (%d)',
    [FileMappingName, GetLastError]
  );

从所提供的证据来看,这就是我能说的全部。但是现在您知道了在程序中搜索什么,以便找到失败的代码。交给你。

我发布了这个答案,因为对这个问题的编辑使得理解历史变得很困难。David在没有看到代码的情况下理解了异常消息的含义,并向区块中的新成员解释了这一点,这给了他一个小提示。

在David的帮助下,您似乎找到了一些防止重复代码实例运行的代码。如果您删除它,您可能不会招致其他处罚,但由于我们无法读取您的代码,因此无法确定这一点。我还将注意到,对于本机开发人员(C++和Delphi)来说,发布和调试模式的概念是显而易见的,对于那些不熟悉编译器和本机代码的人来说,这可能更为微妙。如果您打算维护一个Delphi应用程序,那么买一本关于Delphi的书可能是值得的。如果这是你的第一种编译/母语,那么那里有更多的龙,而且水很快就会沉下去

这段即将消亡的代码很可能是一个元素:

(a) 从一些常用德尔福技术的食谱中复制和粘贴,或

(b) 组件或类的一部分,甚至不是由原始作者编写的

这段代码可能有错误,因为在Windows NT上移动了这个组件代码,例如1998年为Delphi 5编写的组件代码,使其不再运行