找到解决方案,留下帖子,以防有人发现它有用。
现在它看起来很无聊......但是当你通过它的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
显然,当通过指针传递时,结构不会填充。