4

誰かが役に立つと思う場合に備えて、投稿を残して 解決策を見つけました。

今ではそれはとても忘れられているように見えます...しかし、ネイティブ関数でポインタによって構造体を渡すと、ネイティブメモリから自分自身を再読み取りする必要があることを単に知りません。
私のような場合に必要なことは、ネイティブメソッドが戻った後に構造体メソッド 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

このトリックは、ネイティブ関数から何らかの構造を取得する必要がある場合にのみ機能します。

_ _ _ _ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _ __ _ _ _ __ _ _ __ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ ___

現在、私は 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-strings、およびその他の多くのものを返す可能性があります。
だから私はそれを次のようにマッピングしました:

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が仕事をしているときに、それを行うためのより良い方法があると感じ、機能が過負荷になると、1週間も離れません...

それで、皆さん、何か提案はありますか?

PS私の下手な英語と書式設定スキルで申し訳ありません。

おそらく、最初はあまり明確ではありませんでした。ここにコードをいくつか示し
ます。

    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 ゴスト 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   

どうやら、ポインターで渡された場合、構造体は塗りつぶされません。

4

0 に答える 0