0

次の C++コードを作成して作成しましたwin 32 Dynamic link library

#include <windows.h>
#include <some.h>

unsigned char  m_KSN[10];
unsigned char m_inintial_key[16];
unsigned char initial_key[16];

extern "C" __declspec(dllexport) unsigned char* OnDecryption(LPCTSTR stringKSN, 
    LPCTSTR BDK){
        for( i=0;i<10;i++){
            m_KSN[i]=asctohex(stringKSN[2*i],stringKSN[2*i+1]); } 
        for( i=0;i<16;i++){
    m_inintial_key[i]=asctohex(BDK[2*i],BDK[2*i+1]);}
       GetInitalKey(m_KSN, m_inintial_key, initial_key);
       // GetInitialKey function written in `.lib` file. Data type of (Byte*a Byte*    b Byte* c) 
   return initial_key;
  }

私のC#コードは次のとおりです。

static class DecryptionDll
{
  public String BDK = "0111111119ABCDEFFEDCBA9877777777";
  public String KSN = "62994900380000C00329";

  internal static class UnsafeNativeMethods
    {   
        const string _dllLocation = "finalTest.dll";
        [DllImport(_dllLocation)]
        public static extern byte OnDecryption(string ksn, String bdk);
     }
}

ファイルを現在のディレクトリに置き、dll次のコマンドで取得しました。

String path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.
GetExecutingAssembly().Location);

my debugフォルダーが現在のパスであることを示しています。だから私はdllそこに入れました。PInvokeまた、多くの投稿を受け取りましたが、状況を理解できませんでした。私を助けてください..

c++で書かれたメソッドを呼び出すには、何を変更すればよいか、またはc#コードをどのように変更すればよいか教えてくださいdll

編集が多くて大変申し訳ありません。接続が遅いために発生します

4

1 に答える 1

0

C++ 関数は unsigned char データへのポインターを返すように宣言されていますが、何も返しません。コンパイルできるのは驚くべきことです。その宣言と「return」ステートメントがないという事実を考慮すると、C++ コンパイラからエラーが発生するはずです。

m_KSN のアドレスを返すということなのですが、その変数はどこで宣言されているのでしょうか。名前からしてメンバー変数のように見えますが、その関数はメンバー関数ではないようです。

あなたの編集後、物事はまだ整列していません。名前に m_ が含まれる変数が多数あり、メンバー変数であることを示しています。しかし、クラスは存在せず、それらの変数の宣言も表示されません。

C# では、1 バイトを返すように関数を宣言しています。C++ からバイトへのポインターを返しています。これは、通常、バイト配列全体を返したいことを意味します。C# の宣言は、次のようにすべきでしょうか?

public static extern byte [] OnDecryption(string ksn, String bdk);

C++ コードは、渡された文字列の長さを想定しており、それらをテストすることはありません。null 文字列、または思ったよりも短い (または長い) 文字列に足を踏み入れている可能性があります。または、有効な 16 進文字を含まない文字列。

「関数がスタックのバランスを崩している」と具体的に信じている理由を教えてください。そして、それはあなたの機能が何をすることを意味していますか?

同じ変数に対して 2 つの宣言がありますが、以前に使用した配列の背後にある謎を解決するために、いくつかの編集を行ったようです。意図的に違うのですか、それともタイプミスですか?m_m_initial_keym_ninitial_keym_inintial_key

しかし、他の懸念や疑問はまだ残っています。追加の質問はGetInitialKey()関数に関するものだと思います。これはよく知られた Windows 関数ではないため、ソース コードがなければ何をするのか推測できません。たぶん、あなたが渡しているものとは異なるパラメータを期待しており、それが実際に問題を引き起こしています.

unsigned char 配列へのポインターを返したいので、IntPtr を使用してそれを行うことができます。C# で IntPtr を取得したら、関数を使用してデータを配列Marshal.Copyにコピーします。byte []それはすべて次のようになります。

    internal static class UnsafeNativeMethods
    {
        const string _dllLocation = "..\\..\\..\\FinalTest\\debug\\finalTest.dll";
        [DllImport(_dllLocation, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
        public static extern IntPtr OnDecryption(string ksn, String bdk );

        static public byte[] OnDecryptionWrapper(string ksn, string bdk)
        {
            byte[] data = new byte[10];
            IntPtr ptr = OnDecryption(ksn, bdk);

            Marshal.Copy(ptr, data, 0, 10);
            return data;
        }
    }
于 2012-12-20T17:52:16.993 に答える