Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Perl падает при выполнении, Attempt to free unreferenced scalar 
V
    Опции темы
OutlawZ
Дата 1.12.2011, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 269
Регистрация: 19.10.2007

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



Привет всем, очередная напасть свалилась на мою голову, дело в том что я пытаюсь вывести в perl все активные процессы в винде:
Код

use Win32::GUI;
use Win32::API;

Win32::API::Struct->typedef(
 PROCESSENTRY32 => qw {
    DWORD dwSize;
    DWORD cntUsage;
    DWORD th32ProcessID;
    DWORD th32DefaultHeapID;
    DWORD th32ModuleID;
    DWORD cntThreads;
    DWORD th32ParentProcessID;
    LONG pcPriClassBase;
    DWORD dwFlags;
    CHAR  szExeFile;     
});

my $pe32 = Win32::API::Struct->new('PROCESSENTRY32'); 
   
my $CreateToolhelp32Snapshot = Win32::API->new('kernel32','CreateToolhelp32Snapshot', 'NN', 'I' );
my $Process32First = Win32::API->new('kernel32','Process32First','IL','I');
my $Process32Next  = Win32::API->new('kernel32','Process32Next','IL','I');
   my $hSnap = $CreateToolhelp32Snapshot->Call(0x2,0);
      $Process32First->Call($hSnap,$pe32);
      while($Process32Next->Call($hSnap,$pe32)) {
       print $pe32->{th32ModuleID};
      }


При выполнении этого кода вылетает ошибка:
Цитата

Not a HASH reference at proccess.pl line 26. Attempt to free unreferenced scalar: SV 0x1b36f74, Perl interpreter: 0x2a3a04 at  proccess.pl line 26.


Не могу понять что не так, может я неправильно что то прописал? кто сталкивался с такой ошибкой посоветуйте что делать. Прошу только совета а не решения.  smile 


--------------------
user posted image
user posted image
PM MAIL   Вверх
alezzz
Дата 1.12.2011, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

Репутация: нет
Всего: 14



Цитата(OutlawZ @  1.12.2011,  02:01 Найти цитируемый пост)
print $pe32->{th32ModuleID};

необычное обращение к объекту, если напрямую брать данные то может посмотреть структуру Data::Dumper-ом?
там получается $pe32->{typedef} ... а дальше массив, кажется так.

Это сообщение отредактировал(а) alezzz - 1.12.2011, 11:49
PM MAIL   Вверх
JamesMorgan
Дата 1.12.2011, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Посмотрел ваш код, падать у вас начинает когда выполняется функция:
Код

$Process32First->Call($hSnap,$pe32);

Я посмотрел прототип функции в MSDN
Код

BOOL WINAPI Process32First( 
  HANDLE hSnapshot, 
  LPPROCESSENTRY32 lppe 
);


Первый параметр это HANDLE у вас в описании стоит I т.е целое, я точно не знаю но кажется это не правильно, вам нужно узнать как HANDLE описать. 

Цитата

необычное обращение к объекту, если напрямую брать данные то может посмотреть структуру Data::Dumper-ом?

Да это все проясняет
Код

$Process32First->Call($hSnap,$pe32);
print Dumper $pe32;

Выдает
Цитата

$VAR1 = \undef;

Следовательно структура не заполняется, я с Win32::API не работал поэтому что именно не так сказать не могу.
PM MAIL   Вверх
JamesMorgan
Дата 1.12.2011, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Тестировал код завел:
Код

use Win32::API;
use Data::Dumper;
Win32::API::Struct->typedef(
 PROCESSENTRY32 => qw {
    DWORD dwSize;
    DWORD cntUsage;
    DWORD th32ProcessID;
    DWORD th32DefaultHeapID;
    DWORD th32ModuleID;
    DWORD cntThreads;
    DWORD th32ParentProcessID;
    LONG pcPriClassBase;
    DWORD dwFlags;
    CHAR  szExeFile;     
});
my $pe32 = Win32::API::Struct->new('PROCESSENTRY32'); 
   
my $CreateToolhelp32Snapshot = Win32::API->new('kernel32','CreateToolhelp32Snapshot', 'NN', 'I' );
my $Process32First = Win32::API->new('kernel32','Process32First','IP','I');
my $Process32Next  = Win32::API->new('kernel32','Process32Next','IP','I');
   my $hSnap = $CreateToolhelp32Snapshot->Call('5d73',0);
     print Dumper $hSnap;
      print Dumper $Process32First->Call($hSnap,$pe32);
       print Dumper $pe32;

Вывод результат:
Цитата

$VAR1 = 1956;
$VAR1 = 1;
$VAR1 = bless( {
                 '__typedef__' => 'PROCESSENTRY32',
                 'typedef' => [
                                [
                                  'dwSize',
                                  'L',
                                  'DWORD'
                                ],
                                [
                                  'cntUsage',
                                  'L',
                                  'DWORD'
                                ],
                                [
                                  'th32ProcessID',
                                  'L',
                                  'DWORD'
                                ],
                                [
                                  'th32DefaultHeapID',
                                  'L',
                                  'DWORD'
                                ],
                                [
                                  'th32ModuleID',
                                  'L',
                                  'DWORD'
                                ],
                                [
                                  'cntThreads',
                                  'L',
                                  'DWORD'
                                ],
                                [
                                  'th32ParentProcessID',
                                  'L',
                                  'DWORD'
                                ],
                                [
                                  'pcPriClassBase',
                                  'l',
                                  'LONG'
                                ],
                                [
                                  'dwFlags',
                                  'L',
                                  'DWORD'
                                ],
                                [
                                  'szExeFile',
                                  'c',
                                  'CHAR'
                                ]
                              ]
               }, 'Win32::API::Struct' );


Если я правильно понимаю то полям должны были присвоены значения, но так как их нету, значит мы их не получили.
PM MAIL   Вверх
DurRandir
Дата 1.12.2011, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 17



Вы неверный прототип указали. Лучше пишите полный заголовок, BOOL Process32Next(HANDLE hSnapshot, LPPROCESSENTRY32 lppe), если только начали с WinAPI работать) Правильный список параметров - 'IS'. И всё равно не будет работать в таком виде (проверяйте возврат любого вызова! в т.ч. где проверки для CreateToolhelp32Snapshot и Process32First?), т.к., цитируя MSDN, "The calling application must set the dwSize member of PROCESSENTRY32 to the size, in bytes, of the structure. ".

PS: обращение $pe32->{th32ModuleID} для чтения значения из заполненной структуры - правильное.

Это сообщение отредактировал(а) DurRandir - 1.12.2011, 16:20
PM   Вверх
JamesMorgan
Дата 1.12.2011, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Полазил в сети нашел один пример на основе его написал код:
Код

use Win32::API;
use Data::Dumper;
use constant TH32CS_SNAPPROCESS => 0x00000002;
use constant DWORD_SIZE => 4;
use constant LONG_SIZE => 4;
use constant MAX_PATH_SIZE => 260;

my @pList;
my $process;
my $pe32;
my $CreateToolhelp32Snapshot = Win32::API->new('kernel32','CreateToolhelp32Snapshot', 'NN', 'I' );
my $Process32First           = Win32::API->new('kernel32','Process32First','IP','I');
my $Process32Next            = Win32::API->new('kernel32','Process32Next','IP','I');

   $hSnap = $CreateToolhelp32Snapshot->Call(TH32CS_SNAPPROCESS,0);
   $pe32 = " " x (DWORD_SIZE*8+LONG_SIZE+MAX_PATH_SIZE); 
   
    if ( $Process32First->Call($hSnap,$pe32) )
    {
        do {
            # Empty hash
            $process={};

            # Unpack structure to hash
            ($process->{dwSize},
            $process->{cntUsage},
            $process->{th32ProcessID},
            $process->{th32DefaultHeapID},
            $process->{th32ModuleID},
            $process->{cntThreads},
            $process->{th32ParentProcessID},
            $process->{pcPriClassBase},
            $process->{dwFlags},
            $process->{szExeFile}) = unpack("LLLLLLLlLA*",$pe32);

            # Push process to list
            push(@pList,$process); 

            # Fill in the size of the structure again with blanks. 
            $pe32 = " " x (DWORD_SIZE*8+LONG_SIZE+MAX_PATH_SIZE); 

        } while ($Process32Next->Call($hSnap, $pe32));        
    }
    
    print Dumper @pList;


Код выводит список процессов:
Цитата

$VAR19 = {
           'szExeFile' => 'nvsvc32.exe',
           'cntThreads' => 4,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 1992,
           'th32ParentProcessID' => 724,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR20 = {
           'szExeFile' => 'daemonu.exe',
           'cntThreads' => 7,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 168,
           'th32ParentProcessID' => 724,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR21 = {
           'szExeFile' => 'SPIDERNT.EXE',
           'cntThreads' => 6,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 248,
           'th32ParentProcessID' => 724,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR22 = {
           'szExeFile' => 'soundman.exe',
           'cntThreads' => 2,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 1516,
           'th32ParentProcessID' => 1696,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR23 = {
           'szExeFile' => 'rundll32.exe',
           'cntThreads' => 2,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 1716,
           'th32ParentProcessID' => 1696,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR24 = {
           'szExeFile' => 'jusched.exe',
           'cntThreads' => 1,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 884,
           'th32ParentProcessID' => 1696,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR25 = {
           'szExeFile' => 'drwagnui.exe',
           'cntThreads' => 4,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 976,
           'th32ParentProcessID' => 1696,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR26 = {
           'szExeFile' => 'drwagntd.exe',
           'cntThreads' => 17,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 1100,
           'th32ParentProcessID' => 724,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR27 = {
           'szExeFile' => 'SPIDERUI.EXE',
           'cntThreads' => 4,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 548,
           'th32ParentProcessID' => 1696,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR28 = {
           'szExeFile' => 'alg.exe',
           'cntThreads' => 5,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 2240,
           'th32ParentProcessID' => 724,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR29 = {
           'szExeFile' => 'ctfmon.exe',
           'cntThreads' => 1,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 2284,
           'th32ParentProcessID' => 1696,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR30 = {
           'szExeFile' => 'googletalk.exe',
           'cntThreads' => 18,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 2400,
           'th32ParentProcessID' => 1696,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR31 = {
           'szExeFile' => 'ExpanDrive.exe',
           'cntThreads' => 9,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 2540,
           'th32ParentProcessID' => 1696,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR32 = {
           'szExeFile' => 'Skype.exe',
           'cntThreads' => 36,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 2676,
           'th32ParentProcessID' => 1696,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR33 = {
           'szExeFile' => 'putty.exe',
           'cntThreads' => 2,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 3672,
           'th32ParentProcessID' => 1696,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR34 = {
           'szExeFile' => 'firefox.exe',
           'cntThreads' => 35,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 1084,
           'th32ParentProcessID' => 1696,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR35 = {
           'szExeFile' => 'thunderbird.exe',
           'cntThreads' => 27,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 3948,
           'th32ParentProcessID' => 1696,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR36 = {
           'szExeFile' => 'komodo.exe',
           'cntThreads' => 20,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 3944,
           'th32ParentProcessID' => 2236,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR37 = {
           'szExeFile' => 'jucheck.exe',
           'cntThreads' => 4,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 2640,
           'th32ParentProcessID' => 884,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR38 = {
           'szExeFile' => 'plugin-container.e
           'cntThreads' => 25,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 3728,
           'th32ParentProcessID' => 1084,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR39 = {
           'szExeFile' => 'Geany.exe',
           'cntThreads' => 5,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 2600,
           'th32ParentProcessID' => 1696,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR40 = {
           'szExeFile' => 'calc.exe',
           'cntThreads' => 2,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 2560,
           'th32ParentProcessID' => 1696,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR41 = {
           'szExeFile' => 'cmd.exe',
           'cntThreads' => 1,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 632,
           'th32ParentProcessID' => 3460,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
$VAR42 = {
           'szExeFile' => 'perl.exe',
           'cntThreads' => 1,
           'th32ModuleID' => 0,
           'cntUsage' => 0,
           'pcPriClassBase' => 8,
           'dwSize' => 538976288,
           'th32ProcessID' => 584,
           'th32ParentProcessID' => 632,
           'th32DefaultHeapID' => 0,
           'dwFlags' => 0
         };
Для продолжения нажмите любую клавишу . . .


В общем работает, пример на основе которого я написал код можете посмотреть тут
PM MAIL   Вверх
OutlawZ
Дата 1.12.2011, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 269
Регистрация: 19.10.2007

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



Молот, спасибо Bro!


--------------------
user posted image
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




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


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

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