发布
社区首页 >问答首页 >EnumResourceNames返回Windows 998 (对内存位置的无效访问)

EnumResourceNames返回Windows 998 (对内存位置的无效访问)
EN

Stack Overflow用户
提问于 2014-04-11 23:55:06
回答 1查看 1.1K关注 0票数 4

(见底部编辑)

使用EnumResourceNames,我试图在我自己的dll中找到作为资源存储的图标。下面是整个dll代码:

代码语言:javascript
复制
library focusRes;

{$R focusResResource.res} // contains the icons I need to load
{$R *.res}

begin
end.

我可以使用LoadLibrary和LoadLibraryEx正确加载dll (已验证)。但是,对EnumResourceNames的调用返回false,而GetLastError返回998 (对内存位置的无效访问)。呼叫代码是:

代码语言:javascript
复制
hdll := LoadLibraryEx( PChar( DLLFilename ), 0, LOAD_LIBRARY_AS_DATAFILE );
// OR: hdll := LoadLibrary( PChar( DLLFilename ));
enumResult := EnumResourceNames( hDll, RT_ICON, @EnumResFlags, 0 );
// (hDll is the handle returned from LoadLibrary)

以及回调函数:

代码语言:javascript
复制
function EnumResFlags( hDll : HMODULE; ResType, ResName : PChar; 
   notUsed : pointer ) : integer; stdcall;
begin
  // NEVER GETS CALLED
  // log( ResName);
  result := 1; // continue enumeration
end;

回调是一个独立的函数(不是对象方法或本地函数)。

在我的调查中,我发现了一些令人困惑的线索:

  • 问题似乎与我的dll有关,因为如果我从第三方应用程序中替换随机dll,问题就会消失。
  • 问题似乎是不适合我的dll,因为我可以在第三方图标编辑器中打开它,并且所有存储在dll中的图标都被正确加载。
  • 当我试图为一个特定的图标名创建一个resourcestream时,例外是“资源名未找到”。(但图标编辑器认为它很好)

(Windows732位上的Delphi)

编辑1:创建一个新的Delphi并在其中放置以下行:

代码语言:javascript
复制
enumResult := EnumResourceNames( hInstance, RT_ICON, @EnumCallback, 0 );

结果:错误998。将RT_ICON更改为其他东西,如RT_RTCDATA,问题就会消失。

编辑2:如果我不引用回调中的ResName参数,那么问题就不会发生。(如果我只在回调中说“:= 1结果”,就不会出错。)回到德尔福3 (!)得到了同样的精确结果,所以它不是XE特有的。如果我试图用RT_RCDATA代替RT_ICON,就没问题了,可以读ResName。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-12 01:03:14

您没有正确解析回调的lpszTypelpszName参数。失败的测试涉及传递给回调的资源ID,而不是资源名称。当您试图通过指针访问进程内存的第一个64 an时,它是无效的内存访问。

您需要测试ResType/ResName是否是一个名称或ID,然后相应地对待它,如下所示:

代码语言:javascript
复制
function EnumResFlags( hDll : HMODULE; ResType, ResName : PChar; notUsed : pointer ) : integer; stdcall;
begin
  if IS_INTRESOURCE(ResName) then
    log(IntToStr(Integer(ResName)))
  else
    log(ResName);
  ...
end;

如果您的Delphi版本没有定义IS_INTRESOURCE(),您可以手动定义它:

代码语言:javascript
复制
function IS_INTRESOURCE(lpszType: PChar): BOOL;
begin
  Result := ULONG_PTR(lpszType) shr 16 = 0;
end;
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23024402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档