2016-07-15 2 views
0

私はC-DLLで定義されている。このような機能を持って:私は何をやっていることで、この機能をラップしようとしているC#からC-DLLにこの構造体を呼び出す/マーシャリングするときに、この文字列が空であるのはなぜですか?

typedef struct password { 
unsigned char* pPwd; 
unsigned long length; 
} Password; 

:構造体のパスワードは次のようにDLLで定義されている

int AcquireArchive (char* archiveName, Password* password) 

をC#の使用:

[DllImport("name.dll", CharSet = CharSet.Ansi, EntryPoint = "[email protected]", 
CallingConvention = CallingConvention.StdCall)] 
public static extern int AcquireArchive(
[MarshalAs(UnmanagedType.LPStr)] string archiveName, 
ref Password password 
); 

と:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
public struct Password 
{ 
    public string pwd; 
    public ulong length; 
} 
を3210

Iにより、この関数をコールします。今問題は(マニュアルに従って)0 のパスワード長さを示すことは可能それパスワードの値は、返されたコード信号無効なパスワードということである

Password password; 
password.pwd = "password"; 
password.length = (ulong)password.pwd.Length; 

int code = AcquireArchive("Archive", ref password); 

.pwdおよび/またはpassword.lengthは呼び出し/マーシャリングプロセスで失われますか?

悲しいことに、私はdllのソースコードにアクセスできません。

EDIT:文字セットが[UnmanagedType.BStr】除去、今ANSI、TYPO "長さ" である

+0

C++コードはUnicodeを使用していますか? 'CharSet.Auto'はWIndows XP以降でも同様です。 –

+0

UnmanagedType.BStrではありません。削除してください。 CharSet.Auto構造体が間違っている、あなたはCharSet.Ansiを使用する必要があります。 –

+0

私はここにエラーがあると思います:password.lenght <----- "lenght"を修正する必要があります – Mimouni

答えて

1

なるほど、少なくとも一つの問題:あなたのCコードで
(長さが32または64ビットDLLに依存します):

typedef struct { 
    unsigned char* pPwd; 
    unsigned long length; 
} Password; 

して、C#コードで(長さが64ビット)である:それは64ビットである場合

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
public struct Password 
{ 
    public string pwd; 
    public ulong length; 
} 

は、それがOKです。 それは32ビットである場合は、あなたのC#のulongこのようなuintに変更する必要があります。

public struct Password 
{ 
    public string pwd; 
    public uint length; 
} 

私はこのことができます願っています。

+1

それは本当に問題でした!どうもありがとう! –

+0

InteropServicesを使用している場合、データ型の互換性に関する概要シートはありますか?これは、このような誤りを避けるのに最適でしょう –

+0

@ sascha-g:この種の互換性のために、私は恐れることはありません。管理対象から非管理型への変換については、次を参照してください。https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal(v=vs.100).aspx –

関連する問題