【问题标题】:Jna E_OUTOFMEMORYJna E_OUTOFMEMORY
【发布时间】:2018-10-23 16:03:34
【问题描述】:

我为此 c 方法编写了等效的 Java 方法:

HRESULT h3 = CoInitializeEx(NULL, COINIT_MULTITHREADED);
HRESULT h4 = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);

IShellItemImageFactory * item;


HRESULT h = SHCreateItemFromParsingName(L"C:\\Users\\Marcel\\Desktop\\CosmosKernel2Boot.iso", NULL, IID_IShellItemImageFactory, (void**)&item);

if (SUCCEEDED(h)) {

    HBITMAP bit;

    SIZE size = { 32,32 };

    HRESULT hh = item->GetImage(size, SIIGBF_RESIZETOFIT, &bit);
    if (SUCCEEDED(hh)) {
        cout << "SUCCEEDED";
    }
}
item->Release();

CoUninitialize();

Java:

Ole32Extra.INSTANCE.CoInitializeEx(null,Ole32.COINIT_MULTITHREADED);
    Ole32Extra.INSTANCE.CoInitializeSecurity(null, -1, null, null, Ole32Extra.RPC_C_AUTHN_LEVEL_DEFAULT, Ole32Extra.RPC_C_IMP_LEVEL_IMPERSONATE, null, Ole32Extra.EOAC_NONE, null);

    PointerByReference factory = new PointerByReference();

    WinNT.HRESULT h5 = Shell32Extra.INSTANCE.SHCreateItemFromParsingName(new WString("C:\\Users\\Marcel\\Desktop\\Test.txt"),null,new Guid.REFIID(new Guid.IID(Shell32Extra.IID_IShellItemImageFactory)),factory);

    if(COMUtils.SUCCEEDED(h5)) {
        IShellItemImageFactory factory1 = new IShellItemImageFactory(factory.getValue());

        PointerByReference bitP = new PointerByReference();

        WinUser.SIZE size = new WinUser.SIZE(32,32);

        WinNT.HRESULT hi = factory1.GetImage(size,0,bitP);

        if(COMUtils.SUCCEEDED(hi)) {
            WinDef.HBITMAP bit = new WinDef.HBITMAP(bitP.getPointer());

            System.out.println("SUCCEEDED");
        }else{
            System.out.println(hi);
        }
        factory1.Release();
    }else{
        System.out.println(h5);
    }
    Ole32Extra.INSTANCE.CoUninitialize();

当我运行 c 方法时,一切正常,并打印出“SUCCEEDED”。

但是当我运行 Java 方法时,HRESULT hi 总是返回 -2147024882 这意味着 E_OUTOFMEMORY。

我不知道为什么会抛出这个错误,但我希望任何人都可以提供帮助

错误恰好发生在以下几行中:

HRESULT hh = item->GetImage(size, SIIGBF_RESIZETOFIT, &bit);

WinDef.HBITMAP bit = new WinDef.HBITMAP(bitP.getPointer());

【问题讨论】:

  • 在 C 代码中,大小是按值传递。在 Java 案例中,它获取 pointer 并尝试创建相当大的位图,从而导致 E_OUTOFMEMORY。
  • 我该如何在 Java 中解决这个问题?
  • 因为相同的代码在 c 中工作
  • 也许您可以尝试在参数列表中将其定义为int sizeX, int sizeY,而不是将其定义为SIZE 结构?
  • 那行不通,因为 c 方法需要 SIZE 作为参数

标签: java c winapi jna


【解决方案1】:

解决办法是 SIZE struct 不能传值。 (在 C++ 中可以)。 您必须创建一个扩展 SIZE 并实现 Structure.ByValue 的类 SIZEByValue。现在它正在工作。

【讨论】:

    猜你喜欢
    • 2014-11-23
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多