From: <ra...@me...> - 2004-02-19 11:09:04
|
Hello All, I am suggesting we start a new package for Win32 like say Win32::Windows = or Win32::General where in this package we can add or request a specific windows functions = that is not already included in Win32 current packages. For example, I needed to get the Memory = status function I know there is a module called Sysinfo or so but is used by callng WIn32::API which can not = currently included with compiled .exe perl scripts therefore it was a must for me to build s little module for this = function. However every little time I needed one other function. Here is a code to get the memory ststus function and it is = tested and working. Any one is welcomed to start this package and set the rules for it. TODO: of course anyone can help adding these needed by everyone: 1)- Loading Windows Help files using WinHelp function: BOOL WinHelp( HWND hWndMain, LPCTSTR lpszHelp, UINT uCommand, DWORD dwData ); WinHelp(ghWndMain, gszHELPfilename, HELP_QUIT, 0); // unload help=20 2)-Getting and changing the .DLL and .EXE version information, specially these info is not updated to your compied .exe usig perlapp or perl2exe if you see any .exe file you generated by windows explorer "property" it will refer to indygostar website and perl.exe file only. VS_VERSIONINFO {=20 WORD wLength;=20 WORD wValueLength;=20 WORD wType;=20 WCHAR szKey[];=20 WORD Padding1[];=20 VS_FIXEDFILEINFO Value;=20 WORD Padding2[];=20 WORD Children[];=20 };=20 typedef struct _VS_FIXEDFILEINFO { // vsffi=20 DWORD dwSignature;=20 DWORD dwStrucVersion;=20 DWORD dwFileVersionMS;=20 DWORD dwFileVersionLS;=20 DWORD dwProductVersionMS;=20 DWORD dwProductVersionLS;=20 DWORD dwFileFlagsMask;=20 DWORD dwFileFlags;=20 DWORD dwFileOS;=20 DWORD dwFileType;=20 DWORD dwFileSubtype;=20 DWORD dwFileDateMS;=20 DWORD dwFileDateLS;=20 } VS_FIXEDFILEINFO;=20 =20 // File version bRetCode =3D VerQueryValue((LPVOID)lpstrVffInfo, TEXT("\\StringFileInfo\\040904E4\\FileVersion"), (LPVOID *)&lpVersion, puVersionLen); #=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D This code for 2 functions, get memory status and get system path = directory calling directly as my @Mems =3D &Win32::MemoryStatus::MemStatus(); #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" #include <windows.h> MODULE =3D Win32::MemoryStatus PACKAGE =3D Win32::MemoryStatus =20 PROTOTYPES: DISABLE = #=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D # GlobalMemoryStatus exists in the kernel32.dll library void MemStatus() PREINIT: MEMORYSTATUS * mem; PPCODE: GlobalMemoryStatus(mem); EXTEND(SP, 8); PUSHs(sv_2mortal(newSVuv(mem->dwMemoryLoad))); PUSHs(sv_2mortal(newSVuv(mem->dwTotalPhys))); PUSHs(sv_2mortal(newSVuv(mem->dwAvailPhys))); PUSHs(sv_2mortal(newSVuv(mem->dwTotalPageFile))); PUSHs(sv_2mortal(newSVuv(mem->dwAvailPageFile))); PUSHs(sv_2mortal(newSVuv(mem->dwTotalVirtual))); PUSHs(sv_2mortal(newSVuv(mem->dwAvailVirtual))); PUSHs(sv_2mortal(newSVuv(mem->dwLength))); XSRETURN(8); void WinSystemDirectory() PREINIT: LPTSTR lpBuff; UINT PathLen; int BufSize; PPCODE: BufSize =3D 300; lpBuff =3D (LPTSTR) safemalloc(BufSize); PathLen =3D GetSystemDirectory(lpBuff, BufSize); EXTEND(SP, 1); PUSHs(sv_2mortal(newSVpv(lpBuff, PathLen))); safefree(lpBuff); XSRETURN(1); and this is a perl module suggestion for it, of course it can be called = directly package Win32::MemoryStatus; #use 5.008002; use strict; use warnings; require Exporter; # to export the constants to the main:: space require DynaLoader; # to dynuhlode the module. our @ISA =3D qw( Exporter DynaLoader ); # Items to export into callers namespace by default. Note: do not export # names by default without a very good reason. Use EXPORT_OK instead. # Do not simply export all your public functions/methods/constants. # This allows declaration use Win32::MemoryStatus ':all'; # If you do not need this, moving things directly into @EXPORT or = @EXPORT_OK # will save memory. our %EXPORT_TAGS =3D ( 'all' =3D> [ qw( =20 ) ] ); our @EXPORT_OK =3D ( @{ $EXPORT_TAGS{'all'} } ); our @EXPORT =3D qw( =20 ); our $VERSION =3D '0.01'; #require XSLoader; #XSLoader::load('Win32::MemoryStatus', $VERSION); # kernel32.dll bootstrap Win32::MemoryStatus; sub MemoryStatus{ =20 my @Mems =3D &Win32::MemoryStatus::MemStatus(); my %Meminfo; undef %Meminfo; #print join "\n=3D",@Mems; if ($Mems[7] =3D=3D 0) {return undef;} #The size in bytes of the = MEMORYSTATUS data structure. $Meminfo{MemLoad} =3D int($Mems[0]); $Meminfo{TotalPhys} =3D $Mems[1]; $Meminfo{AvailPhys} =3D $Mems[2]; $Meminfo{TotalPage} =3D $Mems[3]; $Meminfo{AvailPage} =3D $Mems[4]; $Meminfo{TotalVirtual} =3D $Mems[5]; $Meminfo{AvailVirtual} =3D $Mems[6]; return %Meminfo; } # Preloaded methods go here. 1; __END__ # Below is stub documentation for your module. You'd better edit it! =3Dhead1 NAME Win32::MemoryStatus - Perl extension for blah blah blah =3Dhead1 SYNOPSIS use Win32::MemoryStatus; blah blah blah =3Dhead1 DESCRIPTION Stub documentation for Win32::MemoryStatus, created by h2xs. It looks = like the author of the extension was negligent enough to leave the stub unedited. Blah blah blah. =3Dhead2 EXPORT None by default. =3Dhead1 SEE ALSO Mention other useful documentation such as the documentation of related modules or operating system documentation (such as man pages in UNIX), or any relevant external documentation such as RFCs or standards. If you have a mailing list set up for your module, mention it here. If you have a web site set up for your module, mention it here. =3Dhead1 AUTHOR A. U. Thor, E<lt>a.u.thor@a.galaxy.far.far.awayE<gt> =3Dhead1 COPYRIGHT AND LICENSE Copyright (C) 2004 by A. U. Thor This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.2 or, at your option, any later version of Perl 5 you may have available. =3Dcut Ramy |
From: Glenn L. <pe...@ne...> - 2004-02-19 18:17:10
|
n approximately 2/19/2004 3:01 AM, came the following characters from the keyboard of ra...@me...: > but is used by callng WIn32::API which can not > currently included with compiled .exe perl scripts > therefore it was a must for me to build s little module for this > function. Could you explain the reason for the problem with Win32::API? Maybe the solution is to fix Win32::API if it is broken for compile .exe perl scripts. What compiler are you using? Do all the compilers have this same problem? Maybe it is a bug in the compiler? -- Glenn -- http://nevcal.com/ =========================== The best part about procrastination is that you are never bored, because you have all kinds of things that you should be doing. |
From: <ra...@me...> - 2004-02-19 18:25:46
|
I am using perl2exe, if I run the scripts that use Win32::API from the command line usig perl script.pl, it works normal if I compile to .exe using perl2exe it shows the error normally Can not read or write memory address xxxx but I also tested with perlapp and I got same errors. My guess is WIN32::API some how allocate memory or some initilzation variable(s) that may its data go out of the allocated space for it or tie(ing) some variables Ramy ----- Original Message ----- From: "Glenn Linderman" <pe...@ne...> To: <ra...@me...> Cc: <per...@li...> Sent: Thursday, February 19, 2004 8:06 PM Subject: Re: [perl-win32-gui-users] New Win32 Package suggestion and sample code > n approximately 2/19/2004 3:01 AM, came the following characters from > the keyboard of ra...@me...: > > > but is used by callng WIn32::API which can not > > currently included with compiled .exe perl scripts > > therefore it was a must for me to build s little module for this > > function. > > Could you explain the reason for the problem with Win32::API? Maybe the > solution is to fix Win32::API if it is broken for compile .exe perl > scripts. What compiler are you using? Do all the compilers have this > same problem? Maybe it is a bug in the compiler? > > -- > Glenn -- http://nevcal.com/ > =========================== > The best part about procrastination is that you are never bored, > because you have all kinds of things that you should be doing. > > |
From: Glenn L. <pe...@ne...> - 2004-02-19 19:38:30
|
You should see if you can create a minimum test case that fails, and post the source. Maybe someone can figure it out. I'll be gone a few days though. On approximately 2/19/2004 10:18 AM, came the following characters from the keyboard of ra...@me...: > I am using perl2exe, if I run the scripts that use Win32::API from the > command > line usig perl script.pl, it works normal if I compile to .exe using > perl2exe it > shows the error normally Can not read or write memory address xxxx > but I also tested with perlapp and I got same errors. > > My guess is WIN32::API some how allocate memory or some initilzation > variable(s) that may its data go out of the allocated space for it or > tie(ing) > some variables > > Ramy > > ----- Original Message ----- > From: "Glenn Linderman" <pe...@ne...> > To: <ra...@me...> > Cc: <per...@li...> > Sent: Thursday, February 19, 2004 8:06 PM > Subject: Re: [perl-win32-gui-users] New Win32 Package suggestion and sample > code > > > >>n approximately 2/19/2004 3:01 AM, came the following characters from >>the keyboard of ra...@me...: >> >> >>> but is used by callng WIn32::API which can not >>>currently included with compiled .exe perl scripts >>>therefore it was a must for me to build s little module for this >>>function. >> >>Could you explain the reason for the problem with Win32::API? Maybe the >>solution is to fix Win32::API if it is broken for compile .exe perl >>scripts. What compiler are you using? Do all the compilers have this >>same problem? Maybe it is a bug in the compiler? >> >>-- >>Glenn -- http://nevcal.com/ >>=========================== >>The best part about procrastination is that you are never bored, >>because you have all kinds of things that you should be doing. >> >> > > > > -- Glenn -- http://nevcal.com/ =========================== The best part about procrastination is that you are never bored, because you have all kinds of things that you should be doing. |
From: <ra...@me...> - 2004-02-19 19:54:40
|
The code is below to test Win32::API with perl2exe: #========================================================== $| = 1; use CGI::Carp; use Carp::Heavy; #========================================================== use threads; use threads::shared; use Thread::Running; use LWP::UserAgent; use attributes; use WIn32::API; share %Result; share %Done; #========================================================== use Win32::GUI; $MW = new Win32::GUI::Window( -title => 'Test', -left => 100, -top => 100, -width => 400, -height => 200, -name => 'MainWindow', -visible => 1, ); $PrintMsg = $MW->AddLabel( -text => "Processing:", -name => "ProcessingLabel", -left => 30, -top => 30, -width => 290, -height => 20, -foreground => 0, -visible=> 1, ); #---------------------------------------- &StartThreads; $MW->Show(); Win32::GUI::Dialog; #---------------------------------------- sub MainWindow_Terminate { return -1; } #========================================================== sub StartThreads{ my ($x, @x, @url); $x = 0; undef @x; @url = ('http://search.cpan.org/', 'http://yahoo.com/', 'http://mewsoft.com/', 'http://ayna.com/', 'http://arabikx.com/', 'http://maktoob.com/', 'http://masrawy.com/', 'http://ajeeb.com/', 'http://egypt.com/', 'http://search.com/'); undef %Thread; undef %Done; undef %Result; for $x(0..9) { $y[0] = $x; $y[1] = $url[$x]; $Done{$x} = 2; $Thread{$x} = threads->new(\&get_url, @y); $Thread{$x}->detach(); $PrintMsg->Text("Created thread $x..."); } #$Thread{0}->join; #sleep 1 until threads->tojoin; #while (! threads->tojoin) {print ".";sleep 1;} # This created the error The memory can not be "read". #$_->join foreach threads->tojoin; # join all joinable threads while (1) { while (my($k, $v) = each %Done) { if ($v==1) { $PrintMsg->Text("Finished Thread $k..."); delete $Done{$k}; } } my $k = keys %Done; if (!$k) {last;} Win32::GUI::DoEvents(); }; $PrintMsg->Text("Finished All Threads..."); return 1; } #========================================================== sub get_url{ my ($id, $url) = @_; my ($text); my $ua = LWP::UserAgent->new; my $response = $ua->get($url); if ($response->is_success) { $text = $response->content; # or whatever #print STDERR "Success URL: $url \n"; } else { #print STDERR "Error URL: $url \n"; $text = $response->status_line; } #return $text; $Result{$id} = $text; $Done{$id} = 1; #return "$id\n"; } #========================================================== |
From: <ra...@me...> - 2004-02-24 08:48:37
|
I downloaded the updated files and tried to build under Windows 2000 but I am getting the error below. Any help would be appreciated. It would be nicer if the new updated version can be packed and update the version number. I remember also I installed before the binary version and was unable to build from the source. I have VC6 on the computer. GUI.xs(2031) : warning C4101: 'targ' : unreferenced local variable GUI.xs(2289) : error C2065: 'WINDOWINFO' : undeclared identifier GUI.xs(2289) : error C2146: syntax error : missing ';' before identifier 'pwi' GUI.xs(2289) : error C2065: 'pwi' : undeclared identifier GUI.xs(2291) : error C2228: left of '.cbSize' must have class/struct/union type GUI.xs(2292) : error C2065: 'GetWindowInfo' : undeclared identifier GUI.xs(2294) : error C2228: left of '.rcClient' must have class/struct/union type GUI.xs(2294) : error C2228: left of '.left' must have class/struct/union type GUI.xs(2295) : error C2228: left of '.rcClient' must have class/struct/union type GUI.xs(2295) : error C2228: left of '.top' must have class/struct/union type GUI.xs(2296) : error C2228: left of '.rcClient' must have class/struct/union type GUI.xs(2296) : error C2228: left of '.right' must have class/struct/union type GUI.xs(2297) : error C2228: left of '.rcClient' must have class/struct/union type GUI.xs(2297) : error C2228: left of '.bottom' must have class/struct/union type *** PACKAGE Win32::GUI::Menu... *** PACKAGE Win32::GUI::MenuButton... *** PACKAGE Win32::GUI::MenuItem... *** PACKAGE Win32::GUI::DialogBox... *** PACKAGE Win32::GUI::Combobox... *** PACKAGE Win32::GUI::UpDown... *** PACKAGE Win32::GUI::Tooltip... *** PACKAGE Win32::GUI::Header... *** PACKAGE Win32::GUI::ComboboxEx... *** PACKAGE Win32::GUI::DateTime... *** PACKAGE Win32::GUI::Brush... *** PACKAGE Win32::GUI::Pen... NMAKE : fatal error U1077: 'cl' : return code '0x2' Stop. Ramy |