2017-08-23 25 views
0

私は、(FindFirstPrinterChangeNotificationを使って)プリンタを監視するためのC++ dllを持っています。私はそれのためにC#ラッパーを作っています:C#プロジェクトのC++ dllをインポートする

private static class NativeMethods { 
     [DllImport("kernel32", SetLastError = true)] 
     public static extern IntPtr LoadLibrary(string lpFileName); 

     [DllImport("kernel32.dll")] 
     public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName); 

     [DllImport("kernel32", SetLastError = true)] 
     public static extern bool FreeLibrary(IntPtr hModule); 
} 

    public string LibPath; 
    private IntPtr LibPtr; 
    private GBtMX GBtMain; 

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
    private delegate void GBtMX(); 

    public GhostBuster() { 
     LibPath = AppDomain.CurrentDomain.BaseDirectory + @"\GhostBusterC.dll"; 
    } 

    public string Init() { 
     if (!File.Exists(LibPath)) 
      return "Incorrect path " + LibPath; 
     LibPtr = NativeMethods.LoadLibrary(LibPath); 
     if (LibPtr == IntPtr.Zero) 
      return "Couldn't import library. Error(GetLastWin32Error): " + Marshal.GetLastWin32Error().ToString(); 

     IntPtr GBtMainPtr = NativeMethods.GetProcAddress(LibPtr, "tmain"); 
     if (GBtMainPtr == IntPtr.Zero) 
      return "No access to GhostBuster.tmain. Error (GetLastWin32Error): " + Marshal.GetLastWin32Error().ToString(); 
     GBtMain = (GBtMX)Marshal.GetDelegateForFunctionPointer(GBtMainPtr, typeof(GBtMX));    
     return ""; 

それは "GhostBuster.tmainへのアクセスエラー(GetLastWin32Error)いいえ:0" を返しません。 何が間違っていますか? ありがとうございます。

答えて

1

p/invokeにSetLastErrorを指定していないので、Marshal.GetLastWin32Error()は何も役に立ちません。 p/invokeは、

[DllImport("kernel32.dll", SetLastError = true)] 
public static extern IntPtr GetProcAddress(
    IntPtr hModule, 
    [MarshalAs(UnmanagedType.LPStr)] 
    string lpProcName 
); 

である必要があります。また、プロシージャ名のマーシャリングについて明示的にすることが理にかなっています。これは常にPE形式を反映したANSI文字列です。

この変更を加えると、DLLがGetProcAddressに渡された名前のものをエクスポートしないことを示すエラーがERROR_PROC_NOT_FOUNDになることが予想されます。

関数名の綴りが正しいことを確認してください。あなたは正しい手紙を手に入れましたか? DLLの作成時に装飾やマングリングが適用されていますか? dumpbinや依存関係ウォーカーなどのツールを使用して、DLLのエクスポートの名前を確認します。

+0

でも同じ出力が得られます。 –

+0

私はあなたと同じ間違いをしたので、最初の文章で説明したのと同じ間違いです!私は今それを編集しました。それは、テキストだけでなく、コードを読むことを支払う.... –

関連する問題