2 Stimmen

C# PInvoke VerQueryValue gibt OutOfMemoryException zurück?

Unten ist der Code-Beispiel, die ich von Online-Ressource bekam, aber es soll mit fullframework arbeiten, aber wenn ich versuche, es mit C# Smart Device zu bauen, wirft es Ausnahme sagen, es ist aus dem Speicher. Weiß jemand, wie kann ich es beheben, um auf kompakte verwenden? die aus dem Speicher Ausnahme, wenn ich den zweiten Aufruf zu VerQueryValue, die die letzte ist.

danke,

    [DllImport("coredll.dll")]
    public static extern bool VerQueryValue(byte[] buffer, string subblock, out IntPtr blockbuffer, out uint len);

    [DllImport("coredll.dll")]
    public static extern bool VerQueryValue(byte[] pBlock, string pSubBlock, out string pValue, out uint len);    
    //
    private static void GetAssemblyVersion()
    {

        string filename = @"\Windows\MyLibrary.dll";
        if (File.Exists(filename))
        {
            try                {

                int handle = 0;
                Int32 size = 0;
                size = GetFileVersionInfoSize(filename, out handle);

                if (size > 0)
                {
                    bool retValue;
                    byte[] buffer = new byte[size];
                    retValue = GetFileVersionInfo(filename, handle, size, buffer);
                    if (retValue == true)
                    {
                        bool success = false;
                        IntPtr blockbuffer = IntPtr.Zero;
                        uint len = 0;
                        //success = VerQueryValue(buffer, "\\", out blockbuffer, out len);
                        success = VerQueryValue(buffer, @"\VarFileInfo\Translation", out blockbuffer, out len);

                        if(success)
                        {
                            int p = (int)blockbuffer;

                            //Reads a 16-bit signed integer from unmanaged memory
                            int j = Marshal.ReadInt16((IntPtr)p);
                            p += 2;

                            //Reads a 16-bit signed integer from unmanaged memory
                            int k = Marshal.ReadInt16((IntPtr)p);

                            string sb = string.Format("{0:X4}{1:X4}", j, k);
                            string spv = @"\StringFileInfo\" + sb + @"\ProductVersion";

                            string versionInfo;
                            VerQueryValue(buffer, spv, out versionInfo, out len);
                        }    
                    }
                }
            }
            catch (Exception err)
            {
                string error = err.Message;
            }
        }
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X