using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication
{
    [StructLayout(LayoutKind.Sequential)]
    public class OpenFileName
    {
        public int structSize;
        public IntPtr dlgOwner = IntPtr.Zero;
        public IntPtr instance = IntPtr.Zero;

        public string filter;
        public string customFilter = null;
        public int maxCustFilter = 0;
        public int filterIndex = 0;

        public string file;
        public int maxFile;

        public string fileTitle;
        public int maxFileTitle;

        public string initialDir;

        public string title;

        public int flags = 0;
        public short fileOffset = 0;
        public short fileExtension = 0;

        public string defExt;

        public IntPtr custData = IntPtr.Zero;
        public IntPtr hook = IntPtr.Zero;

        public string templateName = null;

        public IntPtr reservedPtr = IntPtr.Zero;
        public int reservedInt = 0;
        public int flagsEx = 0;
    }
    
    public class Program
    {
        [DllImport("comdlg32.dll")]
        public static extern bool GetOpenFileName([In, Out] OpenFileName ofn);

        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            
            var ofn = new OpenFileName();

            ofn.structSize = Marshal.SizeOf(ofn);

            ofn.filter = "All files\0*.*\0Log files\0*.log\0Batch files\0*.bat\0";

            ofn.file = new string(new char[256]);
            ofn.maxFile = ofn.file.Length;

            ofn.fileTitle = new string(new char[64]);
            ofn.maxFileTitle = ofn.fileTitle.Length;

            ofn.initialDir = @"C:\";
            ofn.title = "Open file called using platform invoke...";
            ofn.defExt = "txt";

            if (GetOpenFileName(ofn))
            {
                Console.WriteLine("Selected file with full path: {0}", ofn.file);
                Console.WriteLine("Selected file name: {0}", ofn.fileTitle);
                Console.WriteLine("Offset from file name: {0}", ofn.fileOffset);
                Console.WriteLine("Offset from file extension: {0}", ofn.fileExtension);
            }
            
            Console.WriteLine("Goodbye World!");
        }
    }
}