Dll RAPI probleme de convertion d'un code de VB

Programmation d'applications complexes
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Dll RAPI probleme de convertion d'un code de VB

Message par GallyHC »

Bonjour tout le monde.

J'ai un probleme pour convertir un code que j'avais fait en VB pour l'exporte en PureBasic. Ce code permet de listé les fichiers d'un pocket PC

Code : Tout sélectionner

Public Function RapiListFiles(ByVal strFileReps As String) As Boolean
' DECLARATION DES VARIABLES.
    Dim FindData        As CE_FIND_DATA
    Dim SearchHandle    As Long
    Dim FindReturn      As Long
    Dim strResult       As String

' ROUTINE DE LISTAGE DU POCKET-PC.
    strFileReps = strFileReps & "*"
    SearchHandle = CeFindFirstFile(StrPtr(strFileReps), FindData)
    If SearchHandle <> INVALID_HANDLE_VALUE Then
        Do
            strResult = LCase$(UnicodeToAnsi(StrConv(FindData.cFileName, vbFromUnicode)))
            Call List_affichage(strResult)
            FindData.cFileName = vbNullString
            FindReturn = CeFindNextFile(SearchHandle, FindData)
        Loop Until FindReturn = 0
    End If

End Function
Le debut fonctionne sans probleme cela implique la connexion au pocket-pc. Je vous le fourni aussi cela peu, peu etre servir a quelqu'un.

Code : Tout sélectionner

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+
;- DECLARATION DES VARIABLES.

#OPENLIB_0            = 1
#ONE_SECOND           = 1000
#TIME_WAIT_READ       = 5
#INVALID_HANDLE_VALUE = -1

Structure RAPIINIT
    cbSize.l
    heRapiInit.l
    hrRapiInit.l
EndStructure
Structure CEOSVERSIONINFO
    dwOSVersionInfoSize.l
    dwMajorVersion.l
    dwMinorVersion.l
    dwBuildNumber.l
    dwPlatformId.l
    szCSDVersion.s[128]
EndStructure
Structure CE_FIND_DATA
    dwFileAttributes.l
    ftCreationTime.FILETIME
    ftLastAccessTime.FILETIME
    ftLastWriteTime.FILETIME
    nFileSizeHigh.l
    nFileSizeLow.l
    dwOID.l
    cFileName.s[256]
EndStructure

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Procedure.b RapiConnect()
; INITIALISATION DE LA CONNEXION (RAPI.DLL).
  If OpenLibrary(#OPENLIB_0, "rapi.dll")
    Define Hr.l
    Define dwTimeout.l
    Define dwWaitRet.l
    Protected pRapiInit.RAPIINIT
    dwTimeout = #TIME_WAIT_READ * #ONE_SECOND
    pRapiInit\cbSize = SizeOf(pRapiInit)
    pRapiInit\heRapiInit = 0
    pRapiInit\hrRapiInit = 0
    Hr = CallFunction(#OPENLIB_0, "CeRapiInitEx", @pRapiInit)
    If Hr>-1 
      dwWaitRet = WaitForSingleObject_(pRapiInit\heRapiInit, dwTimeout)
      If dwWaitRet = 0
        If pRapiInit\hrRapiInit >= 0
          ProcedureReturn #True
        Else
          ProcedureReturn #False
        EndIf
      Else
        ProcedureReturn #False
      EndIf
    Else
      ProcedureReturn #False
    EndIf
  Else
    ProcedureReturn #False
  EndIf
 
EndProcedure

Procedure.b RapiClose()
; FERMETURE DE LA CONNEXION (RAPI.DLL).
  CallFunction(#OPENLIB_0, "CeRapiUninit")
  CloseLibrary(#OPENLIB_0)

EndProcedure

Procedure.s RapiGetCEOSVersionString() 
; DONNE LA VERSION DU POCKET-PC.
  Protected ceosver.CEOSVERSIONINFO
  ceosver\dwOSVersionInfoSize = SizeOf(ceosver)
  CallFunction(#OPENLIB_0, "CeGetVersionEx", @ceosver)
  ProcedureReturn Str(ceosver\dwMajorVersion) + "." + Str(ceosver\dwMinorVersion) + "." + Str(ceosver\dwBuildNumber) + " " + ceosver\szCSDVersion

EndProcedure 

Procedure.b RapiIsConnect()
; VERIFICATION DE LA CONNEXION.
  If RapiGetCEOSVersionString()<>""
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf

EndProcedure

Procedure.b RAPICopyCEFileToPC(CESourceFile.s,PCDestFile.s)
;

EndProcedure

Procedure.b RAPICopyPCFileToCE(PCSourceFile.s, CEDestFile.s)
;

EndProcedure

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Procedure.s UnicodeToAnsi(chain.s)
;
  Define i.l
  Define j.l
  Define result.s
  j = Len(chain)
  For i = 1 To j
      If Asc(Mid(chain, i, 1)) > 0
          result = result + Mid(chain, i, 1)
      Else
          Goto fin
      EndIf
  Next
  fin:
  ProcedureReturn result

EndProcedure

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

If RapiConnect() = #True
  If RapiIsConnect() = #True
    MessageRequester("Connexion au Pocket-PC", "VERSION: " + RapiGetCEOSVersionString(), #PB_MessageRequester_Ok)
    RapiClose()
  EndIf
EndIf
Merci d'avance de toute l'aide que vous pourriez me fournir,
Cordialement,
GallyHC
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Message par kernadec »

bonjour
regarde du cote des prototype
pour remplacer CallFunction

salut
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Message par GallyHC »

Merci pour la reponse et comme le code pure basic (le but) oui j'utilise deja ce qu'il faut. Mon problème est de reussir a convertir 3 fontions.

1. StrPtr(strFileReps) < je ne vois pas comment faire StrPtr().
2. UnicodeToAnsi(StrConv(FindData.cFileName, vbFromUnicode)) < pareil je ne vois pas pour UnicodeToAnsi() et StrConv().

Voila le debut de ma converstion mais cela ne fonctionne pas pour le moment.

Code : Tout sélectionner

Procedure.b RapiListFiles(filereps.s)
;
  Define finddata.CE_FIND_DATA
  Define searchhandle.l
  Define findreturn.l
  Define result.s
  If Right(filereps,1) <> "*"
    filereps = filereps + "*"
  EndIf
  ;searchhandle = CallFunction(#OPENLIB_0, "CeFindFirstFile", StrPtr(filereps), finddata)
  If searchhandle <> #INVALID_HANDLE_VALUE
      Repeat
          ;result = LCase(UnicodeToAnsi(StrConv(FindData\cFileName, vbFromUnicode)))
          Debug result
          FindReturn = CallFunction(#OPENLIB_0, "CeFindNextFile", SearchHandle, FindData)
      Until FindReturn = 0
  EndIf

EndProcedure
Merci d'avance,
GallyHC
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Message par kernadec »

Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Message par GallyHC »

Merci pour tout ces liens bien utile, mais j'avous ne pas comprendre comment l'adapte.

Merci encore et j'espere pourvoir comprendre comme faire c fonction en pure.
Cordialement,
GallyHC
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Message par kernadec »

je te comprend vbfromunicode c'est pas gagné comme tu peux le voir sur ce post
http://translate.google.com/translate?j ... ry_state0=
bonne soirée
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Message par GallyHC »

Bonjour,

Oui a pas l'air gagne, mais la fonction qui me faudrait en premier est strptr(). Car avec sa je verais comment les données sont structures et en fonction je verais comment resoudre mon probleme.

vraiment encore merci.
Cordialement,
GallyHC
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

StrPtr ne donnerait-il pas l'adresse mémoire d'une chaîne? Le cas échéant, en PureBasic il y a le petit signe arobase.

Code : Tout sélectionner

Define UneChaine.S

UneChaine = "Je suis une chaîne"

Debug @UneChaine
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

GallyHC a écrit :Oui a pas l'air gagne, mais la fonction qui me faudrait en premier est strptr(). Car avec sa je verais comment les données sont structures et en fonction je verais comment resoudre mon probleme.
Il me semble que StrPtr() retourne l'adresse d'une chaîne, un peu comme @MaChaine$ en Purebasic.
Mais en VB, il s'agit probablement d'une chaîne unicode, donc tu dois compiler en mode unicode ou transformer ta chaîne ANSI en UNICODE.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Message par GallyHC »

Re tous,

je me demande si cela servais correct ou pas de faire?

Code : Tout sélectionner

Procedure StrPtr(text.s)
;
  Define *MemPtr.l
  *MemPtr = AllocateMemory(SizeOf(text))
  PokeS(*MemPtr,text,SizeOf(text),#PB_Unicode)
  ProcedureReturn *MemPtr

EndProcedure
cordialement,
GallyHC
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@GailyHC

Ton SizeOf() est inadéquat: il faut le remplacer par Len() ou Length().
Len() c'est le nombre de caractères visible lors de l'affichage.
Length() c'est le nombre d'octets alloués en mémoire par la chaîne.
Mais à mon avis le arobase est suffisant pour remplacer StrPtr()

@Gnozal

Je ne comprends pas trop le problème pour trouver l'adresse d'une chaîne: quelque soit le type (unicode, ansi, etc...) l'adresse ne reste-t-elle pas la même?

Ollivier
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Ollivier a écrit :... l'adresse ne reste-t-elle pas la même?
Si, mais pas le traitement par la suite (j'ai parlé d'une manière générale, en réponse à la question sur StrPtr(), je n'ai pas examiné le code), surtout s'il s'agit de chaînes du type BSTR.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Le sizeof() doit être remplacé par StringByteLength() qui permet de retrouver le nombre d'octets de la chaine en fonction du format.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Message par kernadec »

bonjour
si ca peut aider!! j'ai trouver une doc de la fonction.

StrPtr()
--------

StrPtr() permet de rendre plus efficace la transformation UNICODE. Exemple ci dessous avec une DLL de VB4:

Declare Sub MyUnicodeCall Lib "MyUnicodeDll.Dll" (pStr As Byte)
Sub MakeCall(MyStr As String)
Dim bTmp() As Byte
bTmp = MyStr & vbNullChar
MyUnicodeCall bTmp(0)
MyStr = bTmp
MyStr = Left$(MyStr, Len(MyStr - 1))
End Sub

Dans cet exemple vous pouvez remarquer qu'il faut jouer directement avec un tableau de byte et la tache est un peu usine à gaz !
Maintenant avec la fonction StrPtr() :

Declare Sub MyUnicodeCall Lib "MyUnicodeDll.Dll" (ByVal pStr As Long)
Sub MakeCall(MyStr As String)
MyUnicodeCall StrPtr(MyStr)
End Sub

Tout de suite c'est deja plus simple !
StrPtr() renvoi tout simplement le pointeur d'une chaine de caractere. Et contrairement à VarPtr() c'est le contenu de la variable
qui cette fois est transformée en pointeur et non plus la variable et son type UNICODE ou ANSI qui est transformée !
Le seul problème c'est que StrPtr() accepte que le format ANSI !!! ouh la la on commence à s'y perdre !!!!

Alors pour régler cet autre problème il faut convertir la chaine de caractere UNICODE en ANSI avant d'utiliser le code !
Exemple ci dessous:

Declare Sub MyUnicodeCall Lib "MyUnicodeDll.Dll" (ByVal pStr As Long)
Sub MakeCall(MyStr As String)
MyStr = StrConv(MyStr, vbFromUnicode) <- vbFromUnicode = UNICODE -> ANSI ; vbUnicode = ANSI -> UNICODE
MyUnicodeCall StrPtr(MyStr)
End Sub

Bon voila oufff on y est arrivé !
Pour résumer StrPtr() revoi le pointeur ANSI d'une chaine ANSI qui contrairement à VarPtr() renvoi le pointeur de la variable complete !

auteur: lumesh

cordialement
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Message par GallyHC »

Bonjour,

maintenant il faut comprendre comment adapte tout cela ;).

Codialement,
GallyHC
Répondre