【问题标题】:Use of unassigned local variable "SHELLEXECUTEINFO"使用未分配的局部变量“SHELLEXECUTEINFO”
【发布时间】:2014-02-19 15:40:03
【问题描述】:

大家好,调试我用 c# 编写的应用程序时出错 这是错误:

使用未赋值的局部变量“SHELLEXECUTEINFO”

这是错误行 cbSize = Marshal.SizeOf(sHELLEXECUTEINFO),

我不知道为什么会出现此错误或如何纠正它。

private bool PWOLaunch(int iTab)
    {
        string pWOLocation = Settings.Default.PWOLocation;
        if (!File.Exists(pWOLocation))
        {
            this.openFileDialog1.ShowDialog();
            pWOLocation = this.openFileDialog1.FileName;
            if (!pWOLocation.Contains("PWO.exe"))
            {
                MessageBox.Show("Failed to Locate file: PWO.exe\nThis bot is only for Pokemon World Online!");
                return false;
            }
            if (pWOLocation.Contains("PWO.exe"))
            {
                Settings.Default.PWOLocation = pWOLocation;
                Settings.Default.Save();
            }
        }
        Form1.PROCESS_INFORMATION pROCESSINFORMATION = new Form1.PROCESS_INFORMATION();
        Form1.STARTUPINFO sTARTUPINFO = new Form1.STARTUPINFO();
        Form1.SECURITY_ATTRIBUTES sECURITYATTRIBUTE = new Form1.SECURITY_ATTRIBUTES();
        Form1.SECURITY_ATTRIBUTES sECURITYATTRIBUTE1 = new Form1.SECURITY_ATTRIBUTES();
        Form1.SHELLEXECUTEINFO sHELLEXECUTEINFO = new Form1.SHELLEXECUTEINFO()
        {
            cbSize = Marshal.SizeOf(sHELLEXECUTEINFO),
            lpFile = pWOLocation,
            nShow = 1,
            lpVerb = "runas",
            fMask = 64
        };
        if (!Form1.CreateProcess(pWOLocation, null, ref sECURITYATTRIBUTE, ref sECURITYATTRIBUTE1, false, 32, IntPtr.Zero, null, ref sTARTUPINFO, out pROCESSINFORMATION))
        {
            MessageBox.Show("Failed to Launch file: PWO.exe");
            return false;
        }
        StringBuilder stringBuilder = new StringBuilder("ThunderRT6FormDC");
        IntPtr zero = IntPtr.Zero;
        while (zero == IntPtr.Zero)
        {
            zero = this.FindProcessWindow(stringBuilder, pROCESSINFORMATION.dwProcessId);
        }
        if (!this.EmbedGame(zero, iTab))
        {
            MessageBox.Show("Failed to launch game into bot");
        }
        this.gameWindowHandles[iTab] = zero;
        this.gameProcesshandles[iTab] = pROCESSINFORMATION.dwProcessId;
        this.gameBotHandles[iTab] = IntPtr.Zero;
        this.gameLogHandles[iTab] = IntPtr.Zero;
        Form1.ShowWindow(this.gameWindowHandles[1], 0);
        this.launchAllToolStripMenuItem.Text = "Restart Game";
        return true;
    }

【问题讨论】:

  • 抱歉显示不好我是新来的,我不知道如何编辑我的问题......
  • 您的问题下方有一个edit 按钮。顺便说一句,欢迎来到 Stack Overflow。你可以通过阅读FAQHow to Askhelp center开始学习这个网站
  • 在 Marshal.SizeOf 中,您正在使用该字段,将作业移出。
  • 显示的大部分代码与问题无关。这使得提供帮助变得比必要的困难。我可以将所有这些减少到一行。

标签: c# .net winforms compiler-errors


【解决方案1】:

您的初始化程序在变量初始化之前正在使用它。初始化程序的一个常见的先有鸡还是先有蛋的问题。你可以只使用另一个重载:

    Form1.SHELLEXECUTEINFO sHELLEXECUTEINFO = new Form1.SHELLEXECUTEINFO()
    {
        cbSize = Marshal.SizeOf(typeof(Form1.SHELLEXECUTEINFO)),
        lpFile = pWOLocation,
        // etc...
    };

或者更通用的解决方案:

    Form1.SHELLEXECUTEINFO sHELLEXECUTEINFO = new Form1.SHELLEXECUTEINFO()
    {
        lpFile = pWOLocation,
        // etc...
    };
    sHELLEXECUTEINFO.cbSize = Marshal.SizeOf(sHELLEXECUTEINFO));

顺便请人检查您的代码。

【讨论】:

    【解决方案2】:

    C# 编译器不允许使用未初始化的变量。看起来您在使用 sHELLEXECUTEINFO 变量之前没有对其进行初始化。

    【讨论】:

    • 这很快感谢您的快速回答。但是如何初始化呢?
    • @user3328787 但是请重新格式化您的代码。所以我们可以更好地帮助您。
    猜你喜欢
    • 2013-10-18
    • 2015-11-09
    • 2012-05-18
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多