通过JNA中的Pointer param传递结构(由我自己找到解决方案)

时间:2012-04-04 18:52:27

标签: jna

找到解决方案,留下帖子,以防有人发现它有用。

现在它看起来很无聊......但是当你通过它的Pointer在一些原生函数中传递结构时,它根本不知道它需要从本机内存重新读取它。
在我喜欢的情况下,您需要做的就是在本机方法返回后调用结构方法autoRead(),并且结构将从本机内存重新读取。


这是一些例子:

// Original C code
typedef struct _SomeStructure {
  int x, y;
} SomeStructure;

void DoSomesthing(BYTE* data, int param);   //returns lots of data types, 
                                            //including SomeStructure    

// Equivalent JNA mapping
class SomeStructure extends Structure { public int x, y; }
void DoSomesthing(Pointer data, int param);
...
SomeStructure st = new SomeStructure();
DoSomesthing(st.getPointer(), 100);
st.autoRead(); //structure will be filled

只有当您需要从本机函数获取某些结构时,此技巧才有效。

_ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ < / EM> __ _ __ _ __ _ __ _ __ _ __ < EM> _ __ _ __ _ __ _ __ _ ___

目前我正在研究JNA的存在,所以它可以使用MSCAPI,我遇到了一个小问题。

MSCAPI功能以非常具体的方式设计,因此工作方式与不同的参数完全不同。特别是

BOOL WINAPI CryptGetProvParam(
__in HCRYPTPROV hProv,
__in DWORD dwParam,
__out BYTE *pbData,
__inout DWORD *pdwDataLen,
__in DWORD dwFlags
);

当设置了PROV_ENUMALGS标志时,函数在pbData参数中返回PROV_ENUMALGS结构,但在其他情况下,它可以返回句柄,0t字符串和许多其他东西。
所以我把它映射到:

boolean CryptGetProvParam(
HCRYPTPROV hProv,
int dwParam,
Pointer pbData,
IntByReference pdwDataLen,
int dwFlags
);

但是,当我m tried to call it with PROV_ENUMALGS.getPointer() (as pbData param) structure was not filling, so I ended up with having overloaded function with pdData type PROV_ENUMALGS. It工作,但感觉,有一些更好的方法,然后有超载功能,不会让我一个星期......

那么,伙计们,有什么建议吗?

PS对不起我的英语和格式化技巧。

也许我第一次不太清楚,这里有更多代码:
        HCRYPTPROV hProv = JMSCAPIUtil.contextVerify(null,420);

    PROV_ENUMALGS algs = new PROV_ENUMALGS();       

    if(Advapi32.INSTANCE.CryptGetProvParam(hProv,
            Advapi32.PP_ENUMALGS,
            algs,//.getPointer(),
            new IntByReference(algs.size()),
            Advapi32.CRYPT_FIRST)){
        System.out.println(algs.aiAlgid+"\t"+algs.dwBitLen+"\t"
                + new String(algs.szName,0,algs.dwNameLen.intValue()));
    }else{
        int err=Kernel32.INSTANCE.GetLastError();
        System.out.println(err);
    }       

    JMSCAPIUtil.contextRelease(hProv);  

结果如下:


26154 256 GOST 28147

显然,它叫

boolean CryptGetProvParam(
        HCRYPTPROV hProv,           
        int dwParam,                
        PROV_ENUMALGS pbData,           
        IntByReference pdwDataLen,  
        int dwFlags                         
        );

映射。

如果,//已删除,则会调用

boolean CryptGetProvParam(
        HCRYPTPROV hProv,           
        int dwParam,                
        Pointer pbData,                 
        IntByReference pdwDataLen,  
        int dwFlags                     
        );

映射,结果将是:

0   0   

显然,当通过指针传递时,结构不会填充。

0 个答案:

没有答案