1

私は以下のコードを持っています:

namespace WPFMuskTest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        [DllImport
            ("myDll.DLL", 
             EntryPoint = "?Func1@FUllNameCopiedFromDependancyWalker",
             CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl
            )
        ]
        public static extern System.IntPtr Func1(out System.IntPtr handle, int type, out  DateTime date);

        public MainWindow()
        {
            InitializeComponent();
            //
            // 
            // 
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            System.IntPtr MainParam;
            int thetype = 1
            DateTime date;

            System.IntPtr res = GetFxIRMoveForDate(out MainParam, thetype _til, out date);
        }
    }
}

exeは呼び出されたDLLと同じパスにあり、関数はDLLに確実に存在します(DependacyWalkerで検証済み)が、エラーが発生し続けます:

呼び出される関数プロトタイプは次のとおりです。

class __declspec(dllexport) OUR_DATE_TYPE { .... }

typedef unsigned long TYPE; typedef DATE_TYPE OUR_DATE_TYPE;

namespace1
{
namespace2
{
void func1(MyClass &myclass, const TYPE& type, const DATE_TYPE& date);
}
}

タイプ 'System.AccessViolationException' の未処理の例外

誰でも理由を教えてもらえますか?

4

1 に答える 1

1

デフォルトでは、c++ はcdecl呼び出し規約を使用せず、 stdcall. C には明確に定義されたABIがあるため、c++ api に ac ラッパーを記述して代わりにそれを呼び出す方がおそらく成功するでしょう。

編集: コードをもう一度見てみるとDateTime、C++ で使用している日付型と同じではないかと思います。たとえば、サイズが間違っていると、このエラーが発生する可能性があります。

于 2012-09-24T15:35:15.050 に答える