Convertion BITMAP avec Profondeur de Couleurs (ColorDepth) de 24bits vers 32bits

Résolu
youpidoo Messages postés 12 Date d'inscription samedi 22 octobre 2005 Statut Membre Dernière intervention 6 janvier 2010 - 6 janv. 2010 à 14:58
youpidoo Messages postés 12 Date d'inscription samedi 22 octobre 2005 Statut Membre Dernière intervention 6 janvier 2010 - 6 janv. 2010 à 19:47
Bonjour, je cherche de l'aide sur le sujet suivant :
Convertir un fichier BITMAP avec Profondeur de Couleurs (ColorDepth) de 24-bits ou autre.. mais absolument vers du 32-bits (True Colors).
J'ai trouvé sur le site (à la rubrique ASM-assembleur) une source : 'CONVERSION BITMAP 1, 4, 8, 24 ET 32 BITS' .Mais je ne dispose pas "de quoi assembler" les sources proposées (et l'.exe n'est pas inclus dans le pack pfff!).
Je suis donc à la recherche d'une soluce pour réaliser cela.
Merci d'avance
Youpidoo

5 réponses

youpidoo Messages postés 12 Date d'inscription samedi 22 octobre 2005 Statut Membre Dernière intervention 6 janvier 2010
6 janv. 2010 à 15:56
merci tout de même "Calade" !
3
youpidoo Messages postés 12 Date d'inscription samedi 22 octobre 2005 Statut Membre Dernière intervention 6 janvier 2010
6 janv. 2010 à 15:41
Mon code (Main) (voir/chercher $$$$)
En fait il réalise une convertion d'un .jpg en .bmp
mais il me produit systèmatiquement du 24Bits et pas du 32 (comme recherché). J'utilise (GDI+) voir GdipSaveImageToFile()

Option Explicit

' Image encoder parameter related types
Public Enum EncoderParameterValueType
EncoderParameterValueTypeByte = 1 ' 8-bit unsigned int
EncoderParameterValueTypeASCII = 2 ' 8-bit byte containing one 7-bit ASCII
' code. NULL terminated.
EncoderParameterValueTypeShort = 3 ' 16-bit unsigned int
EncoderParameterValueTypeLong = 4 ' 32-bit unsigned int
EncoderParameterValueTypeRational = 5 ' Two Longs. The first Long is the
' numerator the second Long expresses the
' denomintor.
EncoderParameterValueTypeLongRange = 6 ' Two longs which specify a range of
' integer values. The first Long specifies
' the lower end and the second one
' specifies the higher end. All values
' are inclusive at both ends
EncoderParameterValueTypeUndefined = 7 ' 8-bit byte that can take any value
' depending on field definition
EncoderParameterValueTypeRationalRange = 8 ' Two Rationals. The first Rational
' specifies the lower end and the second
' specifies the higher end. All values
' are inclusive at both ends
End Enum

' Information flags about image codecs
Public Enum ImageCodecFlags
ImageCodecFlagsEncoder = &H1
ImageCodecFlagsDecoder = &H2
ImageCodecFlagsSupportBitmap = &H4
ImageCodecFlagsSupportVector = &H8
ImageCodecFlagsSeekableEncode = &H10
ImageCodecFlagsBlockingDecode = &H20

ImageCodecFlagsBuiltin = &H10000
ImageCodecFlagsSystem = &H20000
ImageCodecFlagsUser = &H40000
End Enum


' NOTE: Enums evaluate to a Long
Public Enum GpStatus ' aka Status
Ok = 0
GenericError = 1
InvalidParameter = 2
OutOfMemory = 3
ObjectBusy = 4
InsufficientBuffer = 5
NotImplemented = 6
Win32Error = 7
WrongState = 8
Aborted = 9
FileNotFound = 10
ValueOverflow = 11
AccessDenied = 12
UnknownImageFormat = 13
FontFamilyNotFound = 14
FontStyleNotFound = 15
NotTrueTypeFont = 16
UnsupportedGdiplusVersion = 17
GdiplusNotInitialized = 18
PropertyNotFound = 19
PropertyNotSupported = 20
End Enum

Private Type GdiplusStartupInput
GdiplusVersion As Long
DebugEventCallback As Long
SuppressBackgroundThread As Long
SuppressExternalCodecs As Long
End Type

Private Type clsid
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type

Private Type ImageCodecInfo
ClassID As clsid
FormatID As clsid
CodecName As Long ' String Pointer; const WCHAR*
DllName As Long ' String Pointer; const WCHAR*
FormatDescription As Long ' String Pointer; const WCHAR*
FilenameExtension As Long ' String Pointer; const WCHAR*
MimeType As Long ' String Pointer; const WCHAR*
flags As ImageCodecFlags ' Should be a Long equivalent
Version As Long
SigCount As Long
SigSize As Long
SigPattern As Long ' Byte Array Pointer; BYTE*
SigMask As Long ' Byte Array Pointer; BYTE*
End Type

' Encoder Parameter structure
Private Type EncoderParameter
Guid As clsid ' GUID of the parameter
NumberOfValues As Long ' Number of the parameter values; usually 1
type As EncoderParameterValueType ' Value type, like ValueTypeLONG etc.
value As Long ' A pointer to the parameter values
End Type

' Encoder Parameters structure
Private Type EncoderParameters
count As Long ' Number of parameters in this structure; Should be 1
Parameter As EncoderParameter ' Parameter values; this CAN be an array!!!! (Use CopyMemory and a string or byte array as workaround)
End Type

'//---------------------------------------------------------------------------
'// Encoder parameter sets
'//---------------------------------------------------------------------------
Private Const EncoderCompression As String = "{E09D739D-CCD4-44EE-8EBA-3FBF8BE4FC58}"
Private Const EncoderColorDepth As String = "{66087055-AD66-4C7C-9A18-38A2310B8337}"
Private Const EncoderScanMethod As String = "{3A4E2661-3109-4E56-8536-42C156E7DCFA}"
Private Const EncoderVersion As String = "{24D18C76-814A-41A4-BF53-1C219CCCF797}"
Private Const EncoderRenderMethod As String = "{6D42C53A-229A-4825-8BB7-5C99E2B9A8B8}"
Private Const EncoderQuality As String = "{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"
Private Const EncoderTransformation As String = "{8D0EB2D1-A58E-4EA8-AA14-108074B7B6F9}"
Private Const EncoderLuminanceTable As String = "{EDB33BCE-0266-4A77-B904-27216099E717}"
Private Const EncoderChrominanceTable As String = "{F2E455DC-09B3-4316-8260-676ADA32481C}"
Private Const EncoderSaveFlag As String = "{292266FC-AC40-47BF-8CFC-A85B89A655DE}"
Private Const CodecIImageBytes As String = "{025D1823-6C7D-447B-BBDB-A3CBC3DFA2FC}"


Private Declare Function lstrlenW Lib "kernel32" (ByVal psString As Any) As Long
Private Declare Function lstrlenA Lib "kernel32" (ByVal psString As Any) As Long

'-----------------------------------------------
' CLSID Generation Related APIs
'-----------------------------------------------
Private Declare Function CLSIDFromString Lib "ole32.dll" (ByVal lpszProgID As Long, pCLSID As clsid) As Long

Private Declare Function GdipCreateBitmapFromScan0 Lib "gdiplus.dll" (ByVal nWidth As Long, ByVal Height As Long, ByVal stride As Long, ByVal PixelFormat As Long, scan0 As Any, nBitmap As Long) As GpStatus
'Gdi plus : load / save

Private Declare Function GdipLoadImageFromFile Lib "gdiplus" (ByVal filename As String, ByRef image As Long) As GpStatus
Private Declare Function GdipSaveImageToFile Lib "gdiplus" (ByVal image As Long, ByVal filename As String, clsidEncoder As clsid, encoderParams As Any) As GpStatus

'Gdi plus : dispose
Private Declare Function GdipDisposeImage Lib "gdiplus" (ByVal image As Long) As GpStatus

Private Declare Function GdiplusStartup Lib "gdiplus" (token As Long, inputbuf As GdiplusStartupInput, Optional ByVal outputbuf As Long = 0) As GpStatus
Private Declare Function GdiplusShutdown Lib "gdiplus" (ByVal token As Long) As GpStatus

Private Declare Function GdipGetImageEncodersSize Lib "gdiplus" (numEncoders As Long, size As Long) As GpStatus
Private Declare Function GdipGetImageEncoders Lib "gdiplus" (ByVal numEncoders As Long, ByVal size As Long, encoders As Any) As GpStatus
Private Declare Function GdipGetImageThumbnail Lib "gdiplus" (ByVal pImage As Long, ByVal thumbwidth As Long, ByVal thumbheight As Long, ByRef thumbImage As Long, ByVal pcallback As Long, ByVal callbackData As Long) As GpStatus
Private Declare Function GdipGetImageDimension Lib "gdiplus" (ByVal image As Long, ByRef width As Single, ByRef Height As Single) As GpStatus
Private Declare Function GdipGetImagePixelFormat Lib "gdiplus" (ByVal nImage As Long, PixelFormat As Long) As Long

'-----------------------------------------------
' String Pointer Related APIs (For the String Utilities)
'-----------------------------------------------
Private Declare Function CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Dest As Any, Src As Any, ByVal cb As Long) As Long

Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long


Public lngHGdiPlus As Long

'Private Const THUMB_DIM As Integer = 96 'Pixel -> W x H (2 dim à la place d'1)
Private Const OUTPUT_FORMAT As String = "image/png" 'Mime type

'-----------------------------------------------
' Variables du (Main) Module Principal
'-----------------------------------------------
Public Dossier As String
Public thisModule As String
Public Param As String
Public Bidon As Variant
Public Anomal As String

Private encoderCLSID As clsid

Private Sub Main()
Const ForReading 1, ForWriting 2, ForAppending = 3
Const TristateUseDefault -2, TristateTrue -1, TristateFalse = 0
Dim fso, f, ts, d, s
Dim ssParam1 As String
Dim ssParam2 As String
Dim ssParam3 As String
'Retrouver le path complet du répertoire hote des fichiers de l'applic (s'il est sur un réseau)
Set fso = CreateObject("Scripting.FileSystemObject")
Set d = fso.GetDrive(fso.GetDriveName(fso.GetAbsolutePathName(App.Path)))

If Len(d.ShareName) > 0 Then
s = d.ShareName
Else
s = App.Path
End If
'Dossier = s
thisModule = s + "" + App.EXEName + ".exe"

'Récup. de l'ensemble des paramètres (du paramètre de ce prog)
Param = Trim$(Command$)
'exemple de param
'Param = "D:\Donnees\Technique\Programmation\VB\CreerXmlPourFotoQueueCS\CreerXmlPourFotoQueueCS_Opt1\masques, 100_1734.jpg, 100_1734.bmp"
If Not (Len(Param)) > 0 _
Then
Bidon = MsgBox("Un ensemble de 3 paramètres (qui est attendu) n'a pas été passé au programme !" + vbCrLf + "Impossible de continuer ! Le programme va s'arrêter..." + vbCrLf + vbCrLf + "Module développé par Marc Pirlot (C) 2010 - Toute reproduction interdite (même partielle !)", vbCritical, App.EXEName + ".exe - Erreur de paramètres !")
End
End If
'Découpage du paramètre en sous-paramètres (séparés par le séparateur ',')
'Dossier, FileNameJpg, FileNameBmp'
ssParam1 = ExtrStrEntre(" " + Param, " ", ",")
Param = Trim$(Right$(Param, Len(Param) - InStr(Param, ", ")))
ssParam2 = ExtrStrEntre(" " + Param, " ", ",")
ssParam3 = Trim$(Right$(Param, Len(Param) - InStr(Param, ",")))

Param = Trim$(Command$)
If ssParam1 = "" _
Or ssParam2 = "" _
Or ssParam3 = "" _
Or Trim$(ssParam2) = Trim$(ssParam3) _
Or InStr(ssParam3, ",,") > 0 _
Then
Bidon = MsgBox("Un ensemble de 3 paramètres séparés par une virgule (',') est attendu !" + vbCrLf + "L'ensemble passé au progamme ne semble pas respecter ce format !" + vbCrLf + "param1, Param2, Param3" + vbCrLf + vbCrLf + " Paramètre passé au module " + thisModule + " : " + Param + vbCrLf + vbCrLf + "Impossible de continuer ! Le programme va s'arrêter...", vbCritical, App.EXEName + ".exe - Erreur de paramètres !")
End
End If

'Affectations
Dossier = ssParam1
Dim FileNameJpg As String '(Path du (ss-)dossier non inclus)
Dim FileNameBmp As String
FileNameJpg = ssParam2
FileNameBmp = ssParam3

If Not (fso.FolderExists(Dossier)) _
Then
Beep
Bidon = MsgBox("Le Dossier passé en paramètre (sous-paramètre 1) : " + vbCrLf + Dossier + vbCrLf + "n'a pas été trouvé" + vbCrLf + vbCrLf + " Paramètre passé au module " + thisModule + " : " + Param + vbCrLf + vbCrLf + "Le programme ne peut poursuivre et va s'arrêter !", vbCritical, App.EXEName + ".exe - Erreur de paramètre !")
End
End If

Dim thisFileNameJpg As String
thisFileNameJpg = FileNameJpg
If Len(thisFileNameJpg) < 4 _
Then
Beep
Bidon = MsgBox("Le nom de l'extension du fichier (au format .Jpg passé en Param2) est invalide !" + vbCrLf + "Veuillez modifier l'extension en .jpg !" + vbCrLf + vbCrLf + "Le programme ne peut poursuivre et va s'arrêter !", vbCritical, App.EXEName + ".exe - Erreur : nom de fichier non attendu !")
Exit Sub
Else
If LCase(Right(thisFileNameJpg, 4)) <> ".jpg" _
Or Len(thisFileNameJpg) = 4 _
Then
Beep
Bidon = MsgBox("Le nom de l'extension du fichier (au format .Jpg passé en Param2) est invalide !" + vbCrLf + "Veuillez modifier l'extension en .jpg !" + vbCrLf + vbCrLf + "Le programme ne peut poursuivre et va s'arrêter !", vbCritical, App.EXEName + ".exe - Erreur : nom de fichier non attendu !")
Exit Sub
End If
End If

Dim thisFileNameBmp As String
thisFileNameBmp = FileNameBmp
If Len(thisFileNameBmp) < 4 _
Then
Beep
Bidon = MsgBox("Le nom de l'extension du fichier (au format .bmp passé en Param3) est invalide !" + vbCrLf + "Veuillez modifier l'extension en .bmp !" + vbCrLf + vbCrLf + "Le programme ne peut poursuivre et va s'arrêter !", vbCritical, App.EXEName + ".exe - Erreur : nom de fichier non attendu !")
Exit Sub
Else
If LCase(Right(thisFileNameBmp, 4)) <> ".bmp" _
Or Len(thisFileNameBmp) = 4 _
Then
Beep
Bidon = MsgBox("Le nom de l'extension du fichier (au format .bmp passé en Param3) est invalide !" + vbCrLf + "Veuillez modifier l'extension en .bmp !" + vbCrLf + vbCrLf + "Le programme ne peut poursuivre et va s'arrêter !", vbCritical, App.EXEName + ".exe - Erreur : nom de fichier non attendu !")
Exit Sub
End If
End If

If Not (fso.FileExists(Dossier + "" + FileNameJpg)) _
Then
Beep
Bidon = MsgBox("Le nom de fichier (.Jpg à convertir) passé en paramètre (sous-paramètre 2) est inexistant dans le dossier : " + vbCrLf + Dossier + vbCrLf + vbCrLf + " Paramètre passé : " + Param + vbCrLf + vbCrLf + "Le programme ne peut poursuivre et va s'arrêter !", vbCritical, App.EXEName + ".exe - Erreur de paramètre !")
End
End If
If (fso.FileExists(Dossier + "" + FileNameBmp)) _
Then
Bidon = fso.DeleteFile(Dossier + "" + FileNameBmp)
End If
DoEvents

'Call GDIPlusInitialize
Call JPGToBMP(Dossier + "" + FileNameJpg, Dossier + "" + FileNameBmp)
'Call GDIPlusTerminate

End Sub

Private Sub JPGToBMP(Source As String, Destination As String)
Call ConvertImage(Source, Destination, 1)
End Sub

Private Sub ConvertImage(Source As String, Destination As String, MimeType As Integer, Optional Quality As Integer = 100)
Dim encoderParams2 As EncoderParameters
Dim lngQuality2 As Long
Dim strMimeType2 As String

'// à mettre sur une Forme
Dim token2 As Long
Dim img2 As Long
'
Dim stat2 As GpStatus

Dim Bidon3 As Long

Dim GpInput2 As GdiplusStartupInput

GpInput2.GdiplusVersion = 1
If GdiplusStartup(token2, GpInput2) <> Ok _
Then
Call InfoErrGDI(CInt(GdiplusStartup(token2, GpInput2)))
DoEvents
Bidon MsgBox("Erreur d'accès aux fonctionnalités de GDI+ (au fichier gdiplus.dll / manquant ?) !" + vbCrLf + vbCrLf + "note : GDI est le 'Graphics Device Interface' des systèmes Microsoft Windows (toutes familles confondues)," + vbCrLf + "il s'agit ici d'une version 'Plus' v.1 (càd. améliorée par rapport à l'ancienne interface 'GDI')." + vbCrLf + vbCrLf + " Paramètre passé au module " + thisModule + " : " + vbCrLf + Param + vbCrLf + vbCrLf + "GDI+ Status-Code " + CStr(stat2) + vbCrLf + "Info / raison / explication complémentaire sur l'erreur : " + Anomal + vbCrLf + vbCrLf + "Le programme ne peut poursuivre et va s'arrêter !", vbCritical, App.EXEName + ".exe - Erreur de configuration logicielle innatendue !")
End
End If

Call GdipLoadImageFromFile(StrConv(Source, vbUnicode), img2)

If MimeType 1 Then strMimeType2 "image/bmp"
If MimeType 2 Then strMimeType2 "image/jpeg"
If MimeType 3 Then strMimeType2 "image/png"

Bidon3 = GetEncoderclsid(strMimeType2, encoderCLSID)

'$$$new Essai pour BMP avec une ColorDepth=32-bits (sans réussite)
'If MimeType = 2 Then
If Quality <= 0 Or Quality > 100 Then
lngQuality2 = 100
Else
lngQuality2 = Quality
End If
encoderParams2.count = 1
With encoderParams2.Parameter
.NumberOfValues = 1
.type = EncoderParameterValueTypeLong
.Guid = DEFINE_GUID2(EncoderQuality)
.value = VarPtr(lngQuality2)
End With
stat2 = GdipSaveImageToFile(img2, StrConv(Destination, vbUnicode), encoderCLSID, encoderParams2)
'Else
'stat2 = GdipSaveImageToFile(img2, StrConv(Destination, vbUnicode), encoderCLSID, ByVal 100)
'End If

Call GdipDisposeImage(img2)
If stat2 = Ok Then
DoEvents
'MsgBox "la conversion s'est terminée avec succès !", vbInformation
Else
Call InfoErrGDI(CInt(stat2))
DoEvents
Bidon MsgBox("il y a eu erreur sérieuse dans un module GDIPlus (gdiplus.dll)" + vbCrLf + "[note : GDI est le 'Graphics Device Interface' des systèmes Microsoft Windows (toutes familles confondues)]," + vbCrLf + "pendant la conversion en (vers) un fichier de type " + strMimeType2 + " !" + vbCrLf + vbCrLf + " Paramètre passé au module " + thisModule + " : " + vbCrLf + Param + vbCrLf + vbCrLf + "GDI+ Status-Code " + CStr(stat2) + vbCrLf + "Info / raison / explication complémentaire sur l'erreur : " + Anomal, vbCritical, App.EXEName + ".exe - Erreur dans un module 'GDIPlus' innatendue !")
End
End If
DoEvents
End Sub

'=======================================================
'GetEncoderClsid passe en revue les encoder disponibles
'sur le système. Si il tombe sur celui dont le mime
'type est égal au mime type stocké dans la variable
'strMimeType, il récupère son CLSID et celui-ci sera
'utilisé par GdipSaveImageToFile.
'=======================================================

Private Function GetEncoderclsid(strMimeType As String, ClassID As clsid) As Long
Dim num As Long
Dim size As Long
Dim I As Long
Dim ICI() As ImageCodecInfo
Dim buffer() As Byte
'Initie la valeur de retour
GetEncoderclsid = CLng(-1)
'Récupère les infos des encoders du système
Call GdipGetImageEncodersSize(num, size)
'Aucun encoder trouvé : quitte la fonction
If size = 0 Then Exit Function
'Initie la taille des buffers
ReDim ICI(1 To num)
ReDim buffer(1 To size)
'Rempli les buffers avec les caractéristiques des encoders
Call GdipGetImageEncoders(num, size, buffer(1))
Call CopyMemory(ICI(1), buffer(1), (Len(ICI(1)) * num))
'Passe en revue la liste des encoders trouvés
For I = 1 To num
'Test si le mime type de l'encoder correspond à celui désiré
If StrComp(PtrToStrW2(ICI(I).MimeType), strMimeType, vbTextCompare) = 0 Then
'Encoder trouvé : retourne sa ClassID et quitte la boucle
ClassID = ICI(I).ClassID
GetEncoderclsid = I
Exit For
End If
Next
'Détruit les buffers
Erase ICI
Erase buffer
End Function

'=============================
'Converti un pointer en chaine
'=============================

Private Function PtrToStrW2(ByVal lpsz As Long) As String
'Déclarations
Dim sOut2 As String
Dim lLen2 As Long
'Récupère la taille de la chaine
lLen2 = lstrlenW(lpsz)
'Si la taille n'est pas nulle
If (lLen2 > 0) Then
'Retourne le résultat sous la forme d'une chaine
sOut2 = StrConv(String$(lLen2, vbNullChar), vbUnicode)
Call CopyMemory(ByVal sOut2, ByVal lpsz, lLen2 * 2)
PtrToStrW2 = StrConv(sOut2, vbFromUnicode)
End If
End Function
Private Function DEFINE_GUID(ByVal sGuid As String) As clsid
Call CLSIDFromString(StrPtr(sGuid), DEFINE_GUID)
End Function

Private Function DEFINE_GUID2(ByVal sGuid As String) As clsid
Call CLSIDFromString(StrPtr(sGuid), DEFINE_GUID2)
End Function


Public Sub InfoErrGDI(status As Integer)
Select Case status
Case 1
Anomal = "GenericError"
Case 2
Anomal = "InvalidParameter"
Case 3
Anomal = "OutOfMemory"
Case 4
Anomal = "ObjectBusy"
Case 5
Anomal = "InsufficientBuffer"
Case 6
Anomal = "NotImplemented"
Case 7
Anomal = "Win32Error"
Case 8
Anomal = "WrongState"
Case 9
Anomal = "Aborted"
Case 10
Anomal = "FileNotFound"
Case 11
Anomal = "ValueOverflow"
Case 12
Anomal = "AccessDenied"
Case 13
Anomal = "UnknownImageFormat"
Case 14
Anomal = "FontFamilyNotFound"
Case 15
Anomal = "FontStyleNotFound"
Case 16
Anomal = "NotTrueTypeFont"
Case 17
Anomal = "UnsupportedGdiplusVersion"
Case 18
Anomal = "GdiplusNotInitialized"
Case 19
Anomal = "PropertyNotFound"
Case 20
Anomal = "PropertyNotSupported"
End Select
End Sub

Public Function ExtrStrEntre(Chn As String, Ch1 As String, Ch2 As String) As String
'Extraire le String entre les caractères Ch1 et Ch2, par exemple entre ()
ExtrStrEntre = Chn
If Trim$(Chn) = "" Then Exit Function
If (Len(Ch1) <> 1) Or (Len(Ch2) <> 1) Then Exit Function
If InStr(Chn, Ch1) 0 Or InStr(Chn, Ch2) 0 Then Exit Function
Dim SsChn As String
SsChn = Right$(Chn, Len(Chn) - InStr(Chn, Ch1))
If InStr(SsChn, Ch2) = 0 Then Exit Function
ExtrStrEntre = Trim$(Left$(SsChn, (InStr(SsChn, Ch2) - 1)))
End Function

Sub RemplacerCar(Chne As String, ScanCar As String, RemplCar As String)
Dim I As Integer
If InStr(1, Chne, ScanCar) = 0 Then
Exit Sub
End If
For I = 1 To Len(Chne)
If Mid$(Chne, I, 1) = ScanCar Then
Chne = Left$(Chne, I - 1) + RemplCar + Right$(Chne, Len(Chne) - I)
If InStr(1, Chne, ScanCar) = 0 Then
I = Len(Chne)
Exit Sub
End If
End If
Next I
End Sub
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
6 janv. 2010 à 15:45
Bonjour,

Il existe des versions gratuites d'Assembleur (une version open source entre autres), mais je ne sais pas du tout si une source est compatible "multi"-assembleur, quant à la modifier... bon courage.


Calade
0
youpidoo Messages postés 12 Date d'inscription samedi 22 octobre 2005 Statut Membre Dernière intervention 6 janvier 2010
6 janv. 2010 à 15:55
Je voulais dire (il fallait lire) "Je suis donc à la recherche d'une soluce VB
pour réaliser cela"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
youpidoo Messages postés 12 Date d'inscription samedi 22 octobre 2005 Statut Membre Dernière intervention 6 janvier 2010
6 janv. 2010 à 19:47
C'est bon!, j'ai trouvé ma solution.
0
Rejoignez-nous