cs_Safireo
Messages postés55Date d'inscriptionlundi 17 mars 2003StatutMembreDernière intervention24 février 2011
-
15 avril 2005 à 11:05
cs_Safireo
Messages postés55Date d'inscriptionlundi 17 mars 2003StatutMembreDernière intervention24 février 2011
-
16 avril 2005 à 14:01
slut tlm !
je cherche à terminer la conversion de ce code en .net.
j'arrive à éliminer les erreurs mais pas à faire fonctionner le logiciel qui doit me rendre le chemin d'accès du fichier joué par winamp
voici le code presque entièrement converti :
---------------------------------------------------------------------------------------
Option
Strict
Off
Option
Explicit
On
Imports VB = Microsoft.VisualBasic
Friend
Class Form1
Inherits System.Windows.Forms.Form
#
Region "Code généré par le Concepteur Windows Form "
Public
Sub
New()
MyBase.New()
If m_vb6FormDefInstance
Is
Nothing
Then
If m_InitializingDefInstance
Then
m_vb6FormDefInstance =
Me
Else
Try
'Pour le formulaire de démarrage, la première instance créée est l'instance par défaut.
If System.Reflection.Assembly.GetExecutingAssembly.EntryPoint.DeclaringType
Is
Me.GetType
Then
m_vb6FormDefInstance =
Me
End
If
Catch
End
Try
End
If
End
If
'Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()
End
Sub
'La méthode substituée Dispose du formulaire pour nettoyer la liste des composants.
Protected
Overloads
Overrides
Sub Dispose(
ByVal Disposing
As
Boolean)
If Disposing
Then
If
Not components
Is
Nothing
Then
components.Dispose()
End
If
End
If
MyBase.Dispose(Disposing)
End
Sub
'Requis par le Concepteur Windows Form
Private components
As System.ComponentModel.IContainer
Public ToolTip1
As System.Windows.Forms.ToolTip
'REMARQUE : la procédure suivante est requise par le Concepteur Windows Form
'Il peut être modifié à l'aide du Concepteur Windows Form.
'Ne pas le modifier à l'aide de l'éditeur de code.
<System.Diagnostics.DebuggerStepThrough()>
Private
Sub InitializeComponent()
Me.components =
New System.ComponentModel.Container
Me.ToolTip1 =
New System.Windows.Forms.ToolTip(
Me.components)
'
'Form1
'
Me.AutoScaleBaseSize =
New System.Drawing.Size(5, 13)
Private
Shared m_InitializingDefInstance
As
Boolean
Public
Shared
Property DefInstance()
As Form1
Get
If m_vb6FormDefInstance
Is
Nothing
OrElse m_vb6FormDefInstance.IsDisposed
Then
m_InitializingDefInstance =
True
m_vb6FormDefInstance =
New Form1()
m_InitializingDefInstance =
False
End
If
DefInstance = m_vb6FormDefInstance
End
Get
Set
m_vb6FormDefInstance = Value
End
Set
End
Property
#
End
Region
'-----------------------------------------------------jusqu'ici, rien d'autre que le code généré qutomatiquement par vb.net
Private
Declare
Function FindWindow
Lib "user32"
Alias "FindWindowA"(
ByVal lpszClassName
As
String,
ByVal lpszWindowName
As
String)
As
Integer
Private
Declare
Function GetWindowThreadProcessId
Lib "user32" (
ByVal hwnd
As
Integer,
ByRef lpdwProcessId
As
Integer)
As
Integer
Private
Declare
Function OpenProcess
Lib "kernel32" (
ByVal dwDesiredAccess
As
Integer,
ByVal bInheritHandle
As
Integer,
ByVal dwProcessId
As
Integer)
As
Integer
Private
Const PROCESS_VM_READ
As
Integer = &H10s
Private
Declare
Function SendMessage
Lib "user32"
Alias "SendMessageA"(
ByVal hwnd
As
Integer,
ByVal msg
As
Integer,
ByVal wParam
As
Integer,
ByVal lParam
As
Integer)
As
Integer
Private
Const WM_USER
As
Integer = &H400s
Private
Const IPC_GETPLAYLISTFILE
As
Integer = 211
Private
Const IPC_GETLISTPOS
As
Integer = 125
'UPGRADE_ISSUE: La déclaration d'un paramètre 'As Any' n'est pas prise en charge. Cliquez ici : 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1016"'
'Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As any, ByVal nSize As Integer, ByRef lpNumberOfBytesRead As Integer) As Integer
'j'ai remplacé la ligne précédente par les deux suivantes
Private
Declare
Function ReadProcessMemory
Lib "kernel32" (
ByVal hProcess
As
Integer,
ByVal lpBaseAddress
As
Integer,
ByRef lpBuffer
As
String,
ByVal nSize
As
Integer,
ByRef lpNumberOfBytesRead
As
Integer)
As
Integer
Private
Declare
Function ReadProcessMemorylong
Lib "kernel32" (
ByVal hProcess
As
Integer,
ByVal lpBaseAddress
As
Integer,
ByRef lpBuffer
As
Long,
ByVal nSize
As
Integer,
ByRef lpNumberOfBytesRead
As
Integer)
As
Integer
Private
Declare
Function CloseHandle
Lib "kernel32" (
ByVal hObject
As
Integer)
As
Integer
Private
Const MAX_PATH
As
Integer = 260
Private hWndWinamp
As
Integer
Private
Sub Form1_Click(
ByVal eventSender
As System.Object,
ByVal eventArgs
As System.EventArgs)
Handles
MyBase.Click
Me.Text = GetPlayingFileName
End
Sub
'quand j'appelle la fonction getwinampwindow, sans aucun message d'erreur, le programme se termine.
'UPGRADE_ISSUE: La constante vbUnicode n'a pas été mise à niveau. Cliquez ici : 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup2070"'
voici le code vb.6
--------------------------------------------------------------------------
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpszClassName As String, ByVal lpszWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, ByRef lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Const PROCESS_VM_READ As Long = &H10
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_USER As Long = &H400
Private Const IPC_GETPLAYLISTFILE As Long = 211
Private Const IPC_GETLISTPOS As Long = 125
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByRef lpBuffer As Any, ByVal nSize As Long, ByRef lpNumberOfBytesRead As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const MAX_PATH As Long = 260
Private hWndWinamp As Long
Private Sub Form_Click()
Me.Caption = GetPlayingFileName
End Sub
cboulas
Messages postés2641Date d'inscriptionmercredi 2 juin 2004StatutMembreDernière intervention 8 janvier 201416 16 avril 2005 à 11:37
Whouaa, tu as utiliser le convertisseur MS.Net, c'est pas trop une bonne chose.
Je te conseil plutôt de réécrire ta source directement dans le .Net et de virer la référence :
microsoft.visualbasic qui deviens quasi inutile mais à laquelle tu pourra faire appel en le précisant comme dans l'exemple suivant :
microsoft.visualbasic.[fonction]
MS.Net offrant déjà pas mal de possibilité autant retirer l'inutile, dès que j'ai un petit moment je jèterais un zieux à ton code pour le simplifier.
Chris...
Web : Firstruner - eMail : [mailto:support@firstruner.com Support]&nbs
cboulas
Messages postés2641Date d'inscriptionmercredi 2 juin 2004StatutMembreDernière intervention 8 janvier 201416 16 avril 2005 à 12:16
Re,
J'ai donc étudier ton script en essayant de l'ajuster à .Net :
Private
Declare
Function FindWindow
Lib "user32"
Alias "FindWindowA" (
ByVal lpszClassName
As
String,
ByVal lpszWindowName
As
String)
As
Integer
Private
Declare
Function GetWindowThreadProcessId
Lib "user32" (
ByVal hwnd
As
Integer,
ByRef lpdwProcessId
As
Integer)
As
Integer
Private
Declare
Function OpenProcess
Lib "kernel32" (
ByVal dwDesiredAccess
As
Integer,
ByVal bInheritHandle
As
Integer,
ByVal dwProcessId
As
Integer)
As
Integer
Private
Declare
Function SendMessage
Lib "user32"
Alias "SendMessageA" (
ByVal hwnd
As
Integer,
ByVal msg
As
Integer,
ByVal wParam
As
Integer,
ByVal lParam
As
Integer)
As
Integer
Private
Declare
Function ReadProcessMemory
Lib "kernel32" (
ByVal hProcess
As
Integer,
ByVal lpBaseAddress
As
Integer,
ByRef lpBuffer
As
String,
ByVal nSize
As
Integer,
ByRef lpNumberOfBytesRead
As
Integer)
As
Integer
Private
Declare
Function ReadProcessMemorylong
Lib "kernel32" (
ByVal hProcess
As
Integer,
ByVal lpBaseAddress
As
Integer,
ByRef lpBuffer
As
Long,
ByVal nSize
As
Integer,
ByRef lpNumberOfBytesRead
As
Integer)
As
Integer
Private
Declare
Function CloseHandle
Lib "kernel32" (
ByVal hObject
As
Integer)
As
Integer
Private
Const WM_USER
As
Integer = &H400S
Private
Const IPC_GETPLAYLISTFILE
As
Integer = 211
Private
Const IPC_GETLISTPOS
As
Integer = 125
Private
Const PROCESS_VM_READ
As
Integer = &H10S
Private
Const MAX_PATH
As
Integer = 260
Private
Sub Form1_Click(
ByVal eventSender
As System.Object,
ByVal eventArgs
As System.EventArgs)
Handles
MyBase.Click
Me.Text = GetPlayingFileName
End
Sub
Public
Function GetPlayingFileName()
As
String
'récupère le chemin d'accès du fichier joué par winamp
Dim strFileName, Temp
As
String
Dim lp, lpWinamp, iIndex, PID, bRet, dwRead
As
Integer
Dim Buffer(MAX_PATH)
As
Byte
Dim hWndWinamp
As
Integer = FindWindow("BaseWindow_RootWnd", "Winamp")
If hWndWinamp = 0
Then
GetPlayingFileName = ""
Exit
Function
End
If
iIndex = SendMessage(hWndWinamp, WM_USER, 0, IPC_GETLISTPOS)
lp = SendMessage(hWndWinamp, WM_USER, iIndex, IPC_GETPLAYLISTFILE)
If lp = 0
Then 'Endrois où VB sort à chaque fois
GetPlayingFileName = ""
Exit
Function
End
If
Call GetWindowThreadProcessId(hWndWinamp, PID)
lpWinamp = OpenProcess(PROCESS_VM_READ, 0, PID)
If lpWinamp = 0
Then
GetPlayingFileName = ""
Exit
Function
End
If
bRet = ReadProcessMemory(lpWinamp, lp, Buffer(0), MAX_PATH, dwRead)
Call CloseHandle(lpWinamp)
Temp = System.Text.UnicodeEncoding.Unicode.GetString(Buffer).ToString
'Temp = System.Text.UnicodeEncoding.Convert(System.Text.UnicodeEncoding.Unicode.GetString(Buffer))
'le code vb6 était Temp = StrConv(Buffer, vbUnicode).
Return Microsoft.VisualBasic.Left(Temp, Microsoft.VisualBasic.InStr(Temp, Microsoft.VisualBasic.Chr(0)) - 1)
End
Function
Il y a encore d'autre ajustement à faire mais c'est déjà plus clair. pour cela j'ai ouvert un nouveau projet, y ai retirer la référence Microsoft.VisualBasic et y ai mis le code ci-dessus
Chris...
Web : Firstruner - eMail : [mailto:support@firstruner.com Support]&nbs
cs_Safireo
Messages postés55Date d'inscriptionlundi 17 mars 2003StatutMembreDernière intervention24 février 2011 16 avril 2005 à 14:01
très gentil de ta part de m'aider...
mais bon, c'est pas l'appel de cette vielle fonction Left qui empêche le code de tourner.
en fait, si j'ai utilisé le convertisseur c que j'ai un peu de mal pour me repérer dans l'univers formé par toutes ces obscures déclarations, alors quand il faut les convertir, les problèmes empirent...
bref, l'erreur venait bien de l'utilisation de la fonction findwindow : ta modification ne fait pas fermer l'application. néanmoins, la fonction renvoit une chaîne ""... ?
je me suis dit qu'il ne trouvait peut-être pas la fenêtre alors j'ai tenté
FindWindow("Winamp v1.x", 0)
ce qui est un peu plus proche du code original et évite également le plantage. mais bon toujours aucun résultat.
j'ai trouvé une page sur le site de winamp qui donne qq indications mais ça m'a l'air d'être du vb6 : http://forums.winamp.com/showthread.php?threadid=180297
bah voila, je continue à chercher à partir de tes modifications...
merci beaucoup pour ton aide
safireo