Laden...

Feher: Ein ref- oder out-Argument muss eine zuweisbare Variable sein.

Erstellt von Andybritten vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.441 Views
A
Andybritten Themenstarter:in
92 Beiträge seit 2009
vor 14 Jahren
Feher: Ein ref- oder out-Argument muss eine zuweisbare Variable sein.

Hey!

Ich bin mal wieder an einem winzig kleinen Problem stecken geblieben.
Nachdem ich selbst nach 2 Stunden Google und ausprobieren nicht mehr weiterkomme muss ich euch um Hilfe bitten.

Im moment übersetze ich einen "kleinen" Stück von VB.net in C#.
Hier ist der VB.Net Code:

<DllImport("Crypt32.dll", SetLastError:=True, CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
   Private Shared Function CryptUnprotectData(ByRef pDataIn As DATA_BLOB, ByVal szDataDescr As String, ByRef pOptionalEntropy As DATA_BLOB, ByVal pvReserved As IntPtr, ByRef pPromptStruct As CRYPTPROTECT_PROMPTSTRUCT, ByVal dwFlags As Integer, ByRef pDataOut As DATA_BLOB) As Boolean
    End Function
    <Flags()> Enum CryptProtectPromptFlags
        CRYPTPROTECT_PROMPT_ON_UNPROTECT = &H1
        CRYPTPROTECT_PROMPT_ON_PROTECT = &H2
    End Enum
    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> Structure CRYPTPROTECT_PROMPTSTRUCT
        Public cbSize As Integer
        Public dwPromptFlags As CryptProtectPromptFlags
        Public hwndApp As IntPtr
        Public szPrompt As String
    End Structure
    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> Structure DATA_BLOB
        Public cbData As Integer
        Public pbData As IntPtr
    End Structure
    Shared Function Decrypt(ByVal Datas() As Byte) As String
        Dim inj, Ors As New DATA_BLOB
        Dim Ghandle As GCHandle = GCHandle.Alloc(Datas, GCHandleType.Pinned)
        inj.pbData = Ghandle.AddrOfPinnedObject()
        inj.cbData = Datas.Length
        Ghandle.Free()
        CryptUnprotectData(inj, Nothing, Nothing, Nothing, Nothing, 0, Ors)
        Dim Returned() As Byte = New Byte(Ors.cbData) {}
        Marshal.Copy(Ors.pbData, Returned, 0, Ors.cbData)
        Dim TheString As String = Encoding.Default.GetString(Returned)
        Return TheString.Substring(0, TheString.Length - 1)
    End Function

Die Problemstelle ist diese:

        CryptUnprotectData(inj, Nothing, Nothing, Nothing, Nothing, 0, Ors)

Anfangs kam als Ergebnis raus dass ich Nothing einfach durch null ersetzen sollte.
Nur das stimmt nicht ganz. Weil Nothing in Vb.net auch für Standartwerte steht, was null nicht macht....
Also nach erstem übersetzen bin ich soweit gekommen:

            CryptUnprotectData(ref inj, null, null, null, null, 0, ref Ors);

Soweit so gut. Jetzt habe ich nach einigem Suchen auch herausgefunden wie man einfach die Standartwerte von DATA_BLOB, IntPtr und CRYPTPROTECT_PROMPTSTRUCT herausfindet:

            CryptUnprotectData(ref inj, null, ref default(DATA_BLOB), default(System.IntPtr), ref default(CRYPTPROTECT_PROMPTSTRUCT), 0, ref Ors);

Und jetzt zu meinem Problem...
Ich habe jetzt die Standartwerte, muss jedoch sie jedoch mit ref übergeben....
Nachdem ich ref vor die Werte gesetzt habe bekomme ich folgenden error:
(Der error tritt bei diesen 2 Variablen auf: ref default(DATA_BLOB) und ref default(CRYPTPROTECT_PROMPTSTRUCT))

Ein ref- oder out-Argument muss eine zuweisbare Variable sein.

Jetzt bin ich leider mit meinem Latein am Ende....
Es wäre sehr nett, wenn mir jemand bei meinem Problem weiterhelfen könnte.

Liebe Grüße

S
72 Beiträge seit 2009
vor 14 Jahren

Hallo Andybritten,

ich glaube du verwechselst da irgendwas. Du rufst eine Methode auf, wie willst du dieser also nun Werte mitgeben die in keiner Variable stehen???


var var1, var2, var3, var4;

CryptUnprotectData(ref var1, null, ref var2, var3, ref var4, 0, ref Ors);

A
Andybritten Themenstarter:in
92 Beiträge seit 2009
vor 14 Jahren

Hast recht. Wie doof.
Habs fixed bekommen mit:


DATA_BLOB asd = new DATA_BLOB();
            CRYPTPROTECT_PROMPTSTRUCT asdf = new CRYPTPROTECT_PROMPTSTRUCT();
            string aha = string.Empty;
            CryptUnprotectData(ref inj, aha, ref asd, default(IntPtr), ref asdf, 0, ref Ors);
3.170 Beiträge seit 2006
vor 14 Jahren

Hallo,

bei structs kannst Du Dir den new-Aufruf sparen, die werden sowieso mit ihrem Defaultwert initialisiert.
Statt default(IntPtr) kannst Du auch IntPtr.Zero nehmen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca