0

コンパクトなフレームワーク (3.5) では、次のようにピンボークがあります。

[DllImport("VAMDll.dll", SetLastError = true, EntryPoint = "openLiteSpatial")]
public static extern int OpenLiteSpatial(byte[] mode, byte[] data, byte[] capture, IntPtr callback);

次のネイティブ関数 sig の場合:

int openLiteSpatial(char *mode, char *data, char *capture, void callBack(char *, char *));

パラメータを内部に渡すと、次のようにうまく機能します。

Native.OpenLiteSpatial(Encoding.UTF8.GetBytes(Mode.FunctionalLocation), Encoding.UTF8.GetBytes(functionalLocation), Encoding.UTF8.GetBytes(capture), Marshal.GetFunctionPointerForDelegate(callback));

しかし、私のコールバックでは、コールバック パラメータ文字列に対していくつかの奇妙な変換を行う必要があります。

public delegate void LiteSpatialCallback(string attributeData, string geoCoordinate);
    public static void Callback(string attributeData, string geoCoordinate)
    {
        byte[] decodedAttributeData = Encoding.Unicode.GetBytes(attributeData);
        byte[] decodedGeoCoordinate = Encoding.Unicode.GetBytes(geoCoordinate);

        attributeData = Encoding.UTF8.GetString(decodedAttributeData, 0, decodedAttributeData.Length);
        geoCoordinate = Encoding.UTF8.GetString(decodedGeoCoordinate, 0, decodedGeoCoordinate.Length);
    }

DllImport 属性で Charset を指定し、byte[] 配列を使用して (これにより、コールバックがまったく呼び出されなくなります)、さまざまな MarshalAs オプションを指定してみました。

より良い方法はありますか?

4

1 に答える 1

0

デリゲート パラメーターに IntPtrs を渡し、メモリ ウィンドウを使用して、何が戻ってくるかを正確に確認したいと思います。データへのポインタですか?ポインタへのポインタ?データ自体?Unicode ですか、それとも ASCII ですか。これらはすべて、返されたアドレスをたどることで特定できます。次に、そのターゲットから手動でコピーするか、調査結果に基づいて P/Invoke および/または署名を委任することができます。

于 2012-05-12T02:35:33.490 に答える