繁体   English   中英

JNA中GlobalAlloc和GlobalLock的返回值有什么区别

[英]What is the difference of return value between GlobalAlloc And GlobalLock in JNA

当我使用jna时,GlobalAlloc和GlobalLock都返回Pointer,但是我发现它们两者的表现好像并不相等。

例如,

在下面的这种情况下,我发现TestStructure实例未处于预期的正确状态。

Kernel32 kernel32 = Native.loadLibrary("kernel32",Kernel32.class);
Pointer pointer = kernel32.GlobalAlloc(ghnd, size);
Pointer pointer2 = kernel32.GlobalLock(pointer);
pointer2.write(0, testbyte, 0, dmSize);
TestStructure structure = new TestStructure(pointer);

但下面的情况可以正常工作。

Kernel32 kernel32 = Native.loadLibrary("kernel32",Kernel32.class);
Pointer pointer = kernel32.GlobalAlloc(ghnd, size);
Pointer pointer2 = kernel32.GlobalLock(pointer);
pointer2.write(0, testbyte, 0, dmSize);
TestStructure structure = new TestStructure(pointer2);

为什么我必须使用pointer2实例创建TestStructure。 我认为指标和指标2都应指向同一位置。

//添加2015.04.03

1是的,我正在Windows平台上工作。

2请参见下面的TestStrucure。

public class TestStructure extends Structure {

  public char[] dmDeviceName = new char[32];
  public WORD dmSpecVersion;
  public WORD dmDriverVersion;
  public WORD dmSize;
  public WORD dmDriverExtra;
  public DWORD dmFields;
  public UnionField1 unionField1;
  public short dmColor;
  public short dmDuplex;
  public short dmYResolution;
  public short dmTTOption;
  public short dmCollate;
  public char[] dmFormname = new char[32];
  public WORD dmLogPixels;
  public DWORD dmBitsPerpel;
  public DWORD dmPelsWidth;
  public DWORD dmPelsHeight;
  public UnionField2 unionField2;
  public DWORD dmDisplayFrequency;

  public TestStructure(Pointer pointer) {
    useMemory(pointer);
    read();
  }

  @Override
  protected List getFieldOrder() {
    return Arrays.asList(new String[] { "dmDeviceName", "dmSpecVersion", "dmDriverVersion", "dmSize",
            "dmDriverExtra", "dmFields", "unionField1", "dmColor", "dmDuplex", "dmYResolution", "dmTTOption",
            "dmCollate", "dmFormname", "dmLogPixels", "dmBitsPerpel", "dmPelsWidth", "dmPelsHeight", "unionField2",
            "dmDisplayFrequency" });
  }
}    

我假设您正在Windows平台上工作。 实际上, GlobalXx函数使人联想到旧的16位Windows。 在那个(旧的)时间里, GlobalAlloc用来返回一个(16位)句柄,该句柄由GlobalLock转换为32位指针。

通过使用GHND = 0x42作为第一个参数,如果您需要可移动存储块,您仍然可以表现出相似的行为。 如果这样做, GlobalAlloc返回一个(32位)句柄,该句柄必须使用GlobalLock转换为真正的指针。 可以在对GlobalLock - GlobalUnlock不同调用中为存储块分配不同的指针值。

MSDN中的页面说明状态:与其他内存管理功能相比,全局功能具有更大的开销并提供更少的功能。 除非文档指出应使用全局函数,否则新应用程序应使用堆函数。 这意味着MicroSoft建议改为使用HeapAlloc serie函数,除非需要使用GlobalAlloc

来自MSDN的参考: GlobalAlloc函数, 比较内存分配方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM