1

ssdeepfuzzy.dllのメソッドを呼び出そうとしています

.hファイルはここにあり、わかりやすいリファレンスはここにあります

具体的には、このメソッドを呼び出そうとしています。

int fuzzy_hash_filename (
        const char * filename,
        char * result 
)   

私は次のものを持っています...

<DllImport("C:\SSDeep\Fuzzy.dll", EntryPoint:="fuzzy_hash_filename")>
Private Shared Function fuzzy_hash_filename(
                                           <InAttribute(),
                                           MarshalAsAttribute(UnmanagedType.LPStr)>
                                           ByVal Filename As String, ByVal Result As StringBuilder) As Integer
End Function


Public Shared Function FuzzyHash(Filename As String) As String
    Dim Ret As New StringBuilder
    Ret.Capacity = NativeConstants.FUZZY_MAX_RESULT
    Dim Success = fuzzy_hash_filename(Filename, Ret)
    If Success <> 0 Then
        Throw New Exception("SSDeep fuzzy hashing failed")
    End If
    Return Ret.ToString
End Function

このコードを実行すると、VSはモーダルダイアログを表示します

PInvoke関数'(Blah):: fuzzy_hash_filename'を呼び出すと、スタックのバランスが崩れます。これは、マネージドPInvokeシグニチャがアンマネージドターゲットシグニチャと一致しないことが原因である可能性があります。PInvokeシグニチャの呼び出し規約とパラメータがターゲットのアンマネージドシグニチャと一致することを確認してください。

(FWIW警告を無視すると通話が成功したように見えるので、近くにいる必要があります)

これを実現するには、定義にどのような変更を加える必要がありますか?

4

2 に答える 2

3

私はMSDNフォーラムで同じ問題を抱えている人を見つけました:

  1. PInvokeStackImbalanceについて。

1.1これは通常、APIで使用される呼び出し規約と、C#コードでAPIに対して宣言されている呼び出し規約の不一致が原因です。

1.2デフォルトでは、DllImportAttributeのCallingConvention引数が設定されていない場合、デフォルトでStdCallが使用されます。

1.3 DoSomething()APIで__cdeclを使用する場合(C ++プロジェクトのデフォルト)、C#コードでDoSomething()に対して次の宣言を使用する必要があります:[DllImport(@ "dll.dll"、CallingConvention = CallingConvention .Cdecl)]

1.4また、APIをextern "C"として宣言することをお勧めします。そうしないと、C++コンパイラによる名前マングリングの対象になります。

于 2012-08-07T09:20:02.897 に答える
1

受け入れられた答えは元の質問者の問題を解決したようですが、c#の同等のコードは私には機能しませんでした。ますます複雑になる注釈を試した後、基本に戻ると最終的には機能しました。参考までに、3つのインターフェイス関数と作業コード( ssdeepバージョン2.9に対してビルドされたもの)の宣言を含めます。

    //Note: StringBuilder here is the standard way to do it, but is a perf hit because unicode stringbuilder can't be pinned when martialling char*.
    //See http://msdn.microsoft.com/en-us/magazine/cc164193.aspx#S4

    //int fuzzy_hash_buf(const unsigned char *buf, uint32_t buf_len, char *result)
    [DllImport("fuzzy.dll")]
    public static extern int fuzzy_hash_buf(StringBuilder buf, int buf_len, StringBuilder result);

    //int fuzzy_hash_filename(const char* filename, char* result)   
    [DllImport("fuzzy.dll")]
    static extern int fuzzy_hash_filename(string filename, StringBuilder result); 

    //int fuzzy_compare (const char *sig1, const char *sig2)
    [DllImport("fuzzy.dll")]
    static extern int fuzzy_compare(string sig1, string sig2); 

    static void Main(string[] args)
    {
        StringBuilder buf = new StringBuilder("test");
        StringBuilder result0 = new StringBuilder(150);
        fuzzy_hash_buf(buf, 4, result0);
        Console.WriteLine(result0);

        string filename = "test.txt";
        StringBuilder result1 = new StringBuilder(150);
        fuzzy_hash_filename(filename, result1);
        Console.WriteLine(result1);

        int matchScore = fuzzy_compare(result0.ToString(), result1.ToString());
        Console.WriteLine("MatchScore: " + matchScore);
    }

出力:

ssdeeptest.exe 3:Hn:Hn 24:gRnIM7stweRp + fEWU1XRk + / M98D6Dv3JrEeEnD / MGQbnEWqv3JW:gRIMwtrMU1Bk2I3Jrg53JW MatchScore:0

于 2012-08-31T16:21:24.677 に答える