Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: Win32::API

  1. #1

    Win32::API

    Ho appena scoperto questo modulo che potrebbe fare al caso mio per un
    progetto che sto intraprendendo.

    Il progetto è intercettare l'audio di un microfono esterno su
    piattaforma windows e redirigerlo in stream tramite Socket.

    Su Win32 c'è una libreria di nome winmm.dll che permette di gestire
    l'audio esterno tramite le funzione waveInxxx

    Per adesso sto facendo alcune prove con Visual Basic ma vorrei portare
    subito il codice in Perl.

    Per fortuna ho trovato su CPAN il modulo Win32::API che mi permetterebbe
    di gestire winmm.dll

    http://search.cpan.org/~acalpini/Win32-API-0.41/API.pm

    Purtroppo non so proprio come usare questo pacchetto!
    Per questo avrei bisogno che qualcono me lo spiegasse!

    Per iniziare mi piacerebbe portare questo codice in Perl:

    codice:
    Private Type WaveInCaps
       ManufacturerID As Integer
       ProductID As Integer
       DriverVersion As Long
       ProductName(1 To 32) As Byte
       Formats As Long
       Channels As Integer
       Reserved As Integer
    End Type
    
    Private Declare Function waveInGetNumDevs Lib "winmm" () As Long
    Private Declare Function waveInGetDevCaps Lib "winmm" Alias 
    "waveInGetDevCapsA" (ByVal uDeviceID As Long, Byval lpCaps As Long, 
    ByVal uSize As Long) As Long
    
    sub InitDevices()
    
       Dim Caps As WaveInCaps, Which As Long, testo As String
    
       For Which = 0 To waveInGetNumDevs - 1
          Call waveInGetDevCaps(Which, VarPtr(Caps), Len(Caps))
          testo = StrConv(Caps.ProductName, vbUnicode) & Which
          msgbox testo
       Next
       
       If Which = 0 Then
          MsgBox "You have no audio input devices!", vbCritical, "Ack!"
          End
       End If
       
    End Sub
    Grazie a tutti!

    Ciao

  2. #2
    Non ho voglia di capire il codice VB

    la Win32::API funza cosi (detto in parole spicciole), ti importa le funzioni presenti nelle DLL (dall'esempio nel POD del modulo)
    codice:
        my $GetCurrentProcessId = Win32::API->new(
            "kernel32", "int GetCurrentProcessId()"
        );
        my $PID = $GetCurrentProcessId->Call();
    
        #### vs.
    
        Win32::API->Import("kernel32", "int GetCurrentProcessId()");
        $PID = GetCurrentProcessId();
    Nel primo caso, crei un nuova funzione specificando, dll da cui attingere, e funzione da ausare, in questo caso hai un oggetto, su cui applicare dei metodi.
    Nel secondo caso la importi, e la chiami come se fosse interna!

    Dopodiche la traduzione da VB->Perl è solo un adattamento di sintassi!

    Spero di esserti stato di aiuto! e che non ti abbia detto cose che tu avevi gia appreso!

    Ah vedo che utilizza una struct... percui penso ti sia necessario anche questo moduletto per creare la struct http://search.cpan.org/~nwclark/perl...lass/Struct.pm


  3. #3
    Il mio problema è come passare i parametri alla .dll

    Potresti fare anche un esempio di come si usa la struct?

    non pensavo fosse tutto cosi' difficile...


  4. #4
    Originariamente inviato da Claudio Vituzzi
    Il mio problema è come passare i parametri alla .dll

    Potresti fare anche un esempio di come si usa la struct?

    non pensavo fosse tutto cosi' difficile...

    Parli delle struct in perl??? Ne so quanto te
    Se in generale ok!

  5. #5

    Piccoli progressi...

    La struttura che segue è tipica di VB:
    codice:
    Private Type WaveInCaps 
    	ManufacturerID As Integer 
    	ProductID As Integer 
    	DriverVersion As Long 
    	ProductName(1 To 32) As Byte 
    	Formats As Long 
    	Channels As Integer 
    	Reserved As Integer 
    End Type
    In Perl la posso rendere tramite Win32::API::Struct
    codice:
    Win32::API::Struct->typedef(WAVEINCAPS => qw( 
    		INT ManufacturerID; 
    		INT ProductID; 
    		LONG DriverVersion; 
    		TCHAR ProductName[32]; 
    		LONG Formats; 
    		INT Channels; 
    		INT Reserved; 
    	) 
    );
    In VB chiamo o lego una struttura ad una variabile cosi':
    codice:
    Dim Caps As WaveInCaps
    In Perl lo farò cosi':
    codice:
    my $caps = Win32::API::Struct->new('WAVEINCAPS');
    La chiamata e il passaggio di valori alla funzione nella DLL in VB avviene cosi':
    codice:
    Call waveInGetDevCaps(0, VarPtr(Caps), Len(Caps))
    Cosi' in Perl:
    codice:
    my $result = waveInGetDevCaps( 
    		0, 
    		$caps, 
    		Win32::API::Struct->sizeof('WAVEINCAPS') 
    );
    informazioni per il modulo Win32::API::Struct

  6. #6
    perche non metti tutte queste informazioni in un bel tutorial???

  7. #7
    Il mio progetto si mette male!

    Ho provato queto codice che dovrebbe riportarmi il numero di WaveIn Device installate sul sistema e delle informazione su di esse:

    codice:
    #!/perl
    
    use strict;
    use warnings;
    use Win32::API;
    use Win32::API::Struct;
    
    use Data::Dumper;
    
    Win32::API::Struct->typedef( "WAVEINCAPS", qw{
    	INT ManufacturerID; 
    	INT ProductID; 
    	LONG DriverVersion; 
    	TCHAR ProductName[32]; 
    	LONG Formats; 
    	INT Channels; 
    	INT Reserved;
    } ) or die "Typedef error $!\n"; 
    
    #Win32::API->Import( winmm => q{LRESULT waveInGetNumDevs()} );
    Win32::API->Import("winmm", "int waveInGetNumDevs()");
    Win32::API->Import( winmm => q{LRESULT waveInGetDevCaps(UINT_PTR DeviceID, LPWAVEINCAPS pwic, UINT cbwic)} );
    
    my $devices = waveInGetNumDevs();
    my $caps = Win32::API::Struct->new("WAVEINCAPS"); # Dim Caps As WaveInCaps
    
    print "Devices: $devices\n\n";
    
    my $result;
    
    for (0 .. ($devices - 1) ) {
    	$result = waveInGetDevCaps($_, $caps, Win32::API::Struct->sizeof('WAVEINCAPS'));
    }
    
    print Dumper $caps;
    Funziona solo: my $devices = waveInGetNumDevs();

    ma print Dumper $caps; restituisce tutte variabili null

    che fare?


  8. #8
    ma il print non lo dovresti fare ad ogni ciclo??
    Tu lo fai alla fine...

    Prova a vedere cosa restitutire ad ogni passo

    bye

  9. #9
    Hai ragione, ma non restituisce niente comunque...

  10. #10
    non so cosa dirti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.