相关疑难解决方法(0)

对于32位Windows可执行文件使用/ LARGEADDRESSAWARE的缺点是什么?

我们需要将其中一个可执行文件与此标志链接,因为它使用大量内存.
但为什么要给一个EXE文件特殊处理.为什么不标准化/ LARGEADDRESSAWARE?

所以问题是:即使你不需要它,使用/ LARGEADDRESSAWARE也有什么问题.为什么不将它用作所有EXE文件的标准?

memory windows memory-management virtual-address-space

32
推荐指数
3
解决办法
2万
查看次数

64位架构 - 从函数返回时截断的字符指针

环境:

Windows x64位,带5GB RAM.我的二进制文件是64位版本,使用版本编译器构建 - "Microsoft(R)C/C++优化编译器版本14.00.50727.762 for x64"

环境设定:

Microsoft建议设置以下注册表项以测试64位应用程序,并在我的框中设置相同.如果我没有设置以下注册表,则不会发生此问题,因为程序位于低地址.讨论中提到了相同的注册表项 - 作为程序员,在迁移到64位窗口时需要担心什么?

要强制分配在较低地址之前从较高地址分配以进行测试,请在调用VirtualAlloc时指定MEM_TOP_DOWN或将以下注册表值设置为0x100000:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management\AllocationPreference

示例代码:

char *alloc_str()
{
    char *temp;
    temp = (char *) malloc(60);
    /* copy some data to temp */
    return temp;
}

main()
{
    char *str;
    str = (char *)alloc_str();
}
Run Code Online (Sandbox Code Playgroud)

分析:

malloc返回0x000007fffe999b40存储的地址,temp但当指针返回时main(),str只获取后半部分 - 0xfffffffffe999b40我无法访问该位置的数据.

c c++ windows 64-bit

6
推荐指数
1
解决办法
3519
查看次数

如何在x64 C++应用程序中保留底部4GB VM

致力于将32位Windows C++应用程序移植到64位.不幸的是,代码在DWORD和指针值之间的两个方向上使用频繁的转换.

其中一个想法是在进程启动期间尽早保留前4GB的虚拟进程空间,以便所有后续的保留内存调用都来自大于4 GB的虚拟地址.这将导致访问冲突错误从指向DWORD的任何不安全的强制转换,然后返回指针,将有助于提前捕获错误.

当我查看一个非常简单的单行C++程序的内存映射时,底部4GB内有很多库加载?有没有办法确保所有库等只加载4GB以上?

谢谢

c++ 64-bit winapi x86-64

4
推荐指数
1
解决办法
756
查看次数

CopyMemory导致Win8上的访问冲突

我有一段代码使用Delphi XE3编译成64位COM DLL.

function TRPMFileReadStream.Read(var Buffer; const Count: Longint): Longint;
begin
  if ((Self.FPosition >= 0) and (Count > 0)) then
  begin
    Result := Self.FSize - Self.FPosition;
    if ((Result > 0) and (Result >= Count)) then
    begin
      if (Result > Count) then
      begin
        Result := Count;
      end;
      CopyMemory(
        Pointer(@Buffer),
        Pointer(LongWord(Self.FMemory) + Self.FPosition),
        Result
      );
      Inc(Self.FPosition, Result);
      Exit;
    end;
  end;
  Result := 0;
end;
Run Code Online (Sandbox Code Playgroud)

在Win7-64bit上,以上工作正常.但在Win8-64bit上,相同的DLL文件将在CopyMemory上抛出Access Violation.CopyMemory在WinAPI.windows单元中实现.

就是这样.

procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: NativeUInt);
begin
  Move(Source^, Destination^, Length);
end;
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢.

delphi 64-bit

3
推荐指数
1
解决办法
985
查看次数

"IMAGE_FILE_LARGE_ADDRESS_AWARE"应该在Delphi6中工作以有效避免EOutOfMemory错误吗?

我从其他帖子中了解到,"IMAGE_FILE_LARGE_ADDRESS_AWARE"可能会有效地扩展内存可用性,例如Delphi 2007.

我不认为这在Delphi6中工作,确实是这样,还是应该有效?或者是否有另一个命令执行相同的操作?

如果没有,我可能需要迁移到更高版本的Delphi.然后,有没有人知道最新版本的Delphi是什么,这将很容易让我迁移我现有的代码(理想情况下,我现有的代码,这是相当简单的Turbo Pascal类型代码,将按原样工作)并将支持"IMAGE_FILE_LARGE_ADDRESS_AWARE"'技巧'扩展内存?

非常感谢!

REMCO

memory delphi

2
推荐指数
1
解决办法
153
查看次数