Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PInvoke Stack Imbalance, насколько это плохо? 
:(
    Опции темы
VisualProgrammerNET
Дата 4.5.2006, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Почётный халявщик
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.10.2005
Где: Зеленоград

Репутация: 4
Всего: 6



Сделал простенькую программку, которая открывает-закрывает выбранный пользователем трей сидирома. Но почему-то постоянно вылетает предупреждение о несбалансированности в стеке. Всё работает, как часы. Нажимаем кнопку - трей выдвигается, и когда открывается полностью, вылетает это предупреждение. Конечно, при работе программы этого нет, но при дебагге очень раздражает...

Что это за напасть, как с ней бороться и насколько это плохо?

На всякий случай, код:
Код

namespace CDWorker
{
    public class CDWorker : Object
    {
        private const uint DRIVE_CDROM = 5;

        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern int GetDriveType(string DriveLetter);

        [DllImport("winmm.dll", EntryPoint = "mciSendStringA")]
        private static extern void mciSendStringA(string Command, string ReturnString, long ReturnLength, long Callback);
        
        public static string[] GetCDROMDrives()
        {
            ArrayList al = new ArrayList();
            foreach (string SDrive in System.Environment.GetLogicalDrives())
            {
                if (GetDriveType(SDrive) == DRIVE_CDROM)
                {
                    al.Add(SDrive);
                }
            }
            string[] CDroms;
            if (al.Count != 0)
            {
                CDroms = new string[al.Count];
                for (int i = 0; i < al.Count; i++)
                    CDroms[i] = (string)al[i];
                return CDroms;
            }
            else
            {
                CDroms = new string[1];
                MessageBox.Show("No CD/DVD-rom drives located!", "Warning");
                return CDroms;
            }
        }
        public static bool OpenDriveTray(string DriveLetter)
        {      
            foreach (string s in GetCDROMDrives())
            {
                if (s == DriveLetter)
                {
                    string rs = "";
                    mciSendStringA(@"set cdaudio!" + DriveLetter + " door open", rs, 0, 0);
                    return true;
                }
            }
            MessageBox.Show("There is no such drive in your system named the letter you've input! \n Or this drive is not CD/DVD-rom! \n \n Common mistake: Check format of input data. It must be X:\\, where X is drive letter.", "Error");
            return false;
        }
        public static bool CloseDriveTray(string DriveLetter)
        {
            foreach (string s in GetCDROMDrives())
            {
                if (s == DriveLetter)
                {
                    string rs = "";
                    mciSendStringA(@"set cdaudio!" + DriveLetter + " door closed", rs, 0, 0);
                    return true;
                }
            }
            MessageBox.Show("There is no such drive in your system named the letter you've input! \n Or this drive is not CD/DVD-rom! \n \n Common mistake: Check format of input data. It must be X:\\, where X is drive letter.", "Error");
            return false;
        }
    }
}

Это мой первый код с использованием PInvoke, писал полностью с нуля сам, так что могут быть огрехи  smile  


--------------------
3 ГОДА НА user posted image 
PM MAIL ICQ   Вверх
Дрон
Дата 4.5.2006, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



У тепя неправильные типы данных в объявлении метода mciSendStringA.

Должно быть int ReturnLength и System.IntPtr Callback.
А long -- это вообще-то 64-битный тип, который в вызовах WinAPI практически (или даже совсем) не применяется.

Добавлено @ 10:48 
MSDN: http://msdn2.microsoft.com/en-us/library/ac7ay120.aspx 


--------------------
Да. Именно так.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0426 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.