2017-06-08 10 views
0

Hyすべて、DllImport Cシャープconst char *

C#で管理されていないDLLから管理対象のDLLにしたいと思っています。正常に動作しますC++では

typedef void* AP_HANDLE 
typedef uint32_t ap_u32 

AP_HANDLE ap_CreateVirtual(const char *szFilename) 

void ap_SetState(AP_HANDLE apbase, const char *szState, int nValue) 

unsigned char *ap_ColorPipe(AP_HANDLE  apbase, 
          unsigned char *pInBuffer, 
          ap_u32   nInBufferSize, 
          ap_u32  *rgbWidth, 
          ap_u32  *rgbHeight, 
          ap_u32  *rgbBitDepth) 

が、C#で構文が問題 である私が

public unsafe class appbase 
{ 
    [DllImport("D:\\apbase.dll", EntryPoint = "ap_CreateVirtual")] 
    //, CharSet = UnicodeEncoding 
    //, CallingConvention = CallingConvention.StdCall 

    public static extern void* ap_CreateVirtual(char* szFilename); 
} 
最初の関数の作業をエヴァンない作ることができないようだ。それはドキュメントの

および

public static void Main() 
    { 
     unsafe 
     { 
      void* ap_handle = null; 

      appbase APPbase = new appbase(); 

      string s = "D:\\ASX.xsdat"; 

      fixed (char* p = s) 
      { 
       ap_handle = APPbase.ap_CreateVirtual(p); 
      } 

      return; 
     } 
    } 

ap_CreateVirtual string、String *、ch ar *、char []、復帰時にブレークポイントを設定します。 ap_handleは常に値0x0000でした

これらの関数をインポートする適切な方法は何ですか?

+1

あなたはCharSet = CharSetでP/Invoke –

答えて

2

char*は、.NET文字列の既定のマーシャリングです。

[DllImport("D:\\apbase.dll", EntryPoint = "ap_CreateVirtual", CharSet = CharSet.Ansi)] 
//, CallingConvention = CallingConvention.StdCall 
public static extern System.IntPtr ap_CreateVirtual(string szFilename); 

C#でcharがないC++ char、C++のwchar_tあるので、あなたのオリジナルの試みは間違っていました。

C#でC++ charが必要な場合は、byteまたはsbyteです。しかし、p/invokeはSystem.Stringで適切な処理を行います。

+1

を読み上げる必要があります。それは分解され、CharSet = CharSet.Unicodeで通過しますが、ポインタはまだ0です...それでは動作しません –

0

C++ヘッダーをコピーするだけでは不十分です。議論が実際に何を意味し、どのように表現されているのかを理解する必要があります。最初の機能は十分に単純である:pInBufferが最も可能性が高いnInBufferSizeによって決まる大きさの固定長byte[]である

[DllImport("...", EntryPoint="ap_CreateVirtual")] 
public static extern IntPtr ap_CreateVirtual(
    [In, MarshalAs(UnmanagedType.LPStr)] string szFilename); 

Iは、第二に、szStateが再び簡単LPSTRであると仮定する。 rgbXXXref引数と思われます。戻り値の型は、再びLPStrになります。

+0

s = "D:\\ ASX.xsdat"の呼び出しの後にまだ分解されているようです。 ap_CreateVirtual(s); –

+0

@ dorin.petreおそらく 'CallingConvention.Cdecl'(おそらく適切な呼び出し規約はドキュメントの一部でなければなりませんが、そうでなければCdeclはおそらくCスタイルの関数が必要です)。また、ネイティブDLLとアプリケーションのビット数が同じであることを確認してください。 - .NETアプリケーションはデフォルトでAnyCPUなので、64ビットシステムでは32ビットのネイティブDLLを呼び出すことができません。そして、正確に何が「崩壊する」のでしょうか? – Luaan

+0

エラー:vshost32.exeが動作を停止しました –

関連する問題