WIP: SV_DLL_WIN #17

Closed
julien.misiak wants to merge 4 commits from SV_DLL_WIN into main
No description provided.
julien.misiak added 4 commits 2024-07-16 09:13:19 +02:00
florian_briand requested changes 2024-07-16 09:37:21 +02:00
@ -4,3 +4,4 @@ version = "0.1.0"
edition = "2021"
[dependencies]
winapi = { version = "0.3.8", features = ["winuser","libloaderapi"] }

Comme évoqué sur Matrix, prend plutôt inspiration sur l'exemple crossplatform ici : https://forge.p4pillon.org/P4Pillon/Krys4lide/src/branch/wip-debug-lib-c pour ne pas avoir besoin de winapi

Comme évoqué sur Matrix, prend plutôt inspiration sur l'exemple crossplatform ici : https://forge.p4pillon.org/P4Pillon/Krys4lide/src/branch/wip-debug-lib-c pour ne pas avoir besoin de winapi
Author
Owner

lorsque je déclare mes accès à la dll avec la syntaxe

"extern "C" {
fn SSV_InitLIB2(pcRepSesamIni: *const c_char) -> c_ushort; ..." ,

j'ai ce problème que je n'ai pas de fichier .lib
= note: LINK : fatal error LNK1181: impossible d'ouvrir le fichier en entrée 'C:\ProgramFiles\santesocial\fsv\1.40.14\lib\ssvw64.dll.lib'

d'où l'utilisation de winapi

lorsque je déclare mes accès à la dll avec la syntaxe "extern "C" { fn SSV_InitLIB2(pcRepSesamIni: *const c_char) -> c_ushort; ..." , j'ai ce problème que je n'ai pas de fichier .lib = note: LINK : fatal error LNK1181: impossible d'ouvrir le fichier en entrée 'C:\ProgramFiles\santesocial\fsv\1.40.14\lib\ssvw64.dll.lib' d'où l'utilisation de winapi

Est ce que tu as bien suivi les étapes du README de l'exemple ?

Car y'a des chemins à définir dans le path, et des chemins en fichier de config utilisés par le compilateur

Est ce que tu as bien suivi les étapes du README de l'exemple ? Car y'a des chemins à définir dans le path, et des chemins en fichier de config utilisés par le compilateur
@ -0,0 +19,4 @@
while current_pos_general < bytes.len() - 1 {
num_champ = 0;
current_groupe = 256 * bytes[current_pos_general] as i32 + bytes[current_pos_general + 1] as i32;

Je te conseille de sortir tous les bouts de codes "un peu compliqué", comme cette ligne par exemple, dans des fonctions, pour gagner en lisibilité :

Par exemple :

fn compute_current_group(bytes: &[u8], position: usize) -> i32 {
    256 * bytes[position] as i32 + bytes[position + 1] as i32
}

pub fn decode_zone_memoire( ZDonneesSortie: *mut std::ffi::c_void,TTailleDonneesSortie: usize){
// ...
    while current_pos_general < bytes.len() - 1 {
        num_champ = 0;
        current_groupe = compute_current_group(bytes, current_pos_general);
// ...
Je te conseille de sortir tous les bouts de codes "un peu compliqué", comme cette ligne par exemple, dans des fonctions, pour gagner en lisibilité : Par exemple : ``` fn compute_current_group(bytes: &[u8], position: usize) -> i32 { 256 * bytes[position] as i32 + bytes[position + 1] as i32 } pub fn decode_zone_memoire( ZDonneesSortie: *mut std::ffi::c_void,TTailleDonneesSortie: usize){ // ... while current_pos_general < bytes.len() - 1 { num_champ = 0; current_groupe = compute_current_group(bytes, current_pos_general); // ... ```
Author
Owner

ça m'est égal, il me parait un peu too much de faire des fonctions pour remplacer une ligne de code

ça m'est égal, il me parait un peu too much de faire des fonctions pour remplacer une ligne de code

L'enjeu, c'est d'avoir une bonne lisibilité du code, à long terme, pour l'ensemble des dev.

Donc ça peut s'obtenir autrement que par le découpage ; à minima par des commentaires

Mais ici, je crois qu'on gagnerait à découper certaines fonctions, car on pourrait leur mettre des tests unitaires et car on aura sans doute besoin y nouveau de décalage de bits?

L'enjeu, c'est d'avoir une bonne lisibilité du code, à long terme, pour l'ensemble des dev. Donc ça peut s'obtenir autrement que par le découpage ; à minima par des commentaires Mais ici, je crois qu'on gagnerait à découper certaines fonctions, car on pourrait leur mettre des tests unitaires et car on aura sans doute besoin y nouveau de décalage de bits?
Author
Owner

oui je crois des commentaires pourrait suffire dans ce cas,
C'est une traduction du code VB.Net bien aidé par l'IA, d'où l'absence de commentaire.

Je ferai le nécessaire pour rendre le code lisible. J'ai plutôt pour habitude de copier coller des parties de code lorsque c'est juste quelques fois,
Pour info, lorsqu'on aura programmer les quelques décodage de zone mémoire nécessaires, je garanti qu'on n'y reviendra pas.

oui je crois des commentaires pourrait suffire dans ce cas, C'est une traduction du code VB.Net bien aidé par l'IA, d'où l'absence de commentaire. Je ferai le nécessaire pour rendre le code lisible. J'ai plutôt pour habitude de copier coller des parties de code lorsque c'est juste quelques fois, Pour info, lorsqu'on aura programmer les quelques décodage de zone mémoire nécessaires, je garanti qu'on n'y reviendra pas.
  • Améliorer la lisibilité du code
- [ ] Améliorer la lisibilité du code
@ -0,0 +32,4 @@
current_pos_general += 1;
acc + (256_i32.pow(i as u32) * bytes[current_pos_general] as i32) as usize
});
}

Idem ici, on peut extraire tout ce bloc dans une fonction dédiée, pour clarifier le code :

/// Calcule la longueur du groupe à partir de la position actuelle dans la tranche de bytes.
///
/// Arguments:
/// * `bytes`: La tranche de bytes à analyser.
/// * `current_pos_general`: La position actuelle dans la tranche de bytes.
///
/// Retourne:
/// * La longueur du groupe calculée.
/// * La nouvelle position actuelle après calcul.
fn calculer_longueur_groupe(bytes: &[u8], mut current_pos_general: usize) -> (usize, usize) {
    let longueur_groupe: usize;
    if bytes[current_pos_general] < 128 {
        longueur_groupe = bytes[current_pos_general] as usize;
    } else {
        let nbre_octets_longueur = bytes[current_pos_general] - 128;
        longueur_groupe = (0..nbre_octets_longueur).fold(0, |acc, i| {
            current_pos_general += 1;
            acc + (256_i32.pow(i as u32) * bytes[current_pos_general] as i32) as usize
        });
    }
    current_pos_general += 1;
    (longueur_groupe, current_pos_general)
}
let (longueur_groupe, nouvelle_position) = calculer_longueur_groupe(&bytes, current_pos_general);
current_pos_general = nouvelle_position;
Idem ici, on peut extraire tout ce bloc dans une fonction dédiée, pour clarifier le code : ``` /// Calcule la longueur du groupe à partir de la position actuelle dans la tranche de bytes. /// /// Arguments: /// * `bytes`: La tranche de bytes à analyser. /// * `current_pos_general`: La position actuelle dans la tranche de bytes. /// /// Retourne: /// * La longueur du groupe calculée. /// * La nouvelle position actuelle après calcul. fn calculer_longueur_groupe(bytes: &[u8], mut current_pos_general: usize) -> (usize, usize) { let longueur_groupe: usize; if bytes[current_pos_general] < 128 { longueur_groupe = bytes[current_pos_general] as usize; } else { let nbre_octets_longueur = bytes[current_pos_general] - 128; longueur_groupe = (0..nbre_octets_longueur).fold(0, |acc, i| { current_pos_general += 1; acc + (256_i32.pow(i as u32) * bytes[current_pos_general] as i32) as usize }); } current_pos_general += 1; (longueur_groupe, current_pos_general) } ``` ``` let (longueur_groupe, nouvelle_position) = calculer_longueur_groupe(&bytes, current_pos_general); current_pos_general = nouvelle_position; ```
@ -0,0 +67,4 @@
6 => println!("Groupe1.Champ6: {}", String::from_utf8_lossy(&bytes_champ)),
7 => println!("Groupe1.Champ7: {}", String::from_utf8_lossy(&bytes_champ)),
8 => println!("Groupe1.Champ8: {}", String::from_utf8_lossy(&bytes_champ)),
_ => (),

Et l'idéal, ici, serait de stocker ces valeurs dans une structure appropriée, en nommant + explicitement les champs, et éventuellement en les typant de manière + appropriée que juste un String ?

struct Groupe1 {
    champ1: String,
    champ2: String,
    champ3: String,
    champ4: String,
    champ5: String,
    champ6: String,
    Prenom: String,
    champ8: String,
}
Et l'idéal, ici, serait de stocker ces valeurs dans une structure appropriée, en nommant + explicitement les champs, et éventuellement en les typant de manière + appropriée que juste un String ? ``` struct Groupe1 { champ1: String, champ2: String, champ3: String, champ4: String, champ5: String, champ6: String, Prenom: String, champ8: String, } ```
Author
Owner

des que tu es dispo je te montrerai ce que j'avais fait en vb.
J'avais déclaré des classes avec des properties qui permettaient de bien "jouer" avec tous les éléments. (et même d'avoir des displayName)
exemple pour une date
Public Property Champ1 As String (Date mise au format « AAAAMMJJ0000)
Public Property Date_de_début_droits_AMO As Nullable(Of Date)

le set de l'un fixe la valeur de l'autre

(et c'est là que Rust qui ne gère pas les classes me parait limite, pour une programmation orientée objet la gestion de classes serait à mon sens bien plus importante que la gestion optimale de la mémoire dont on ne manquera pas, alors certes on trouvera des solutions avec des struct et des impl et des trait, mais quelle galère.... )

des que tu es dispo je te montrerai ce que j'avais fait en vb. J'avais déclaré des classes avec des properties qui permettaient de bien "jouer" avec tous les éléments. (et même d'avoir des displayName) exemple pour une date Public Property Champ1 As String (Date mise au format « AAAAMMJJ0000) Public Property Date_de_début_droits_AMO As Nullable(Of Date) le set de l'un fixe la valeur de l'autre (et c'est là que Rust qui ne gère pas les classes me parait limite, pour une programmation orientée objet la gestion de classes serait à mon sens bien plus importante que la gestion optimale de la mémoire dont on ne manquera pas, alors certes on trouvera des solutions avec des struct et des impl et des trait, mais quelle galère.... )

Pas de soucis pour faire ce genre de chose en Rust, car on peut faire des choses de type Programmation objet

Dans la doc & formation Rust c'est les concepts de Structure, de Templates et de Traits

On peut se faire une session de pair programming pour implémenter ça :)

Pas de soucis pour faire ce genre de chose en Rust, car on peut faire des choses de type Programmation objet Dans la doc & formation Rust c'est les concepts de Structure, de Templates et de Traits On peut se faire une session de pair programming pour implémenter ça :)
Author
Owner

j'aurais bien besoin d'une session formation sur l'environnement de dev qui est bien plus compliqué que ce que j'ai l'habitude de mettre en place.
par exemple là, je ne sais pas tester wip-debug-libc...

Pour les concepts de Structure, de Templates et de Traits, je crois que je devrais m'en sortir quand on se sera mis d'accord sur la méthode. On pourrait commencer ensemble pour que je sois sûr que je vais dans la bonne direction et je voudrais bien voire avec toi si tu valides les concepts que j'avais mis en place dans ma programmation .Net

Donc pour se faire, on pourrait se faire du pair programming des que tu es dispo
(mais si besoin je pourrais aussi me déplacer d'ici dix à quinze jours)

j'aurais bien besoin d'une session formation sur l'environnement de dev qui est bien plus compliqué que ce que j'ai l'habitude de mettre en place. par exemple là, je ne sais pas tester wip-debug-libc... Pour les concepts de Structure, de Templates et de Traits, je crois que je devrais m'en sortir quand on se sera mis d'accord sur la méthode. On pourrait commencer ensemble pour que je sois sûr que je vais dans la bonne direction et je voudrais bien voire avec toi si tu valides les concepts que j'avais mis en place dans ma programmation .Net Donc pour se faire, on pourrait se faire du pair programming des que tu es dispo (mais si besoin je pourrais aussi me déplacer d'ici dix à quinze jours)

Ça roule ; par contre, possible que j'ai pas trop de temps avant la semaine prochaine

  • Faire une session de pair programming sur la structuration des données CPS
Ça roule ; par contre, possible que j'ai pas trop de temps avant la semaine prochaine - [ ] Faire une session de pair programming sur la structuration des données CPS
@ -4,0 +23,4 @@
println!("Taille sortie SSV_LireCartePS : {}", TTailleDonneesSortie);
println!("ZDonneesSortie: {:?}", ZDonneesSortie);
CPS::decode_zone_memoire(ZDonneesSortie,TTailleDonneesSortie)

Est-ce que tu pourrais fournir, dans un fichier d'exemple, un exemple de ZDonneesSortie et TTailleDonneesSortie ? Comme ça on pourrait travailler sur le code, même sans avoir le lecteur de carte

Est-ce que tu pourrais fournir, dans un fichier d'exemple, un exemple de ZDonneesSortie et TTailleDonneesSortie ? Comme ça on pourrait travailler sur le code, même sans avoir le lecteur de carte
Author
Owner

Est-ce que tu peux faire avec ça?
les valeurs sont en decimale

Taille sortie SSV_LireCartePS : 140
ZDonneesSortie: 0x1e75ad4cc40
Octet: 0
Octet: 1
Octet: 51
Octet: 1
Octet: 48
Octet: 1
Octet: 56
Octet: 11
Octet: 57
Octet: 57
Octet: 55
Octet: 48
Octet: 48
Octet: 53
Octet: 50
Octet: 52
Octet: 49
Octet: 57
Octet: 52
Octet: 1
Octet: 52
Octet: 2
Octet: 50
Octet: 50
Octet: 17
Octet: 80
Octet: 72
Octet: 65
Octet: 82
Octet: 77
Octet: 65
Octet: 67
Octet: 73
Octet: 69
Octet: 78
Octet: 48
Octet: 48
Octet: 53
Octet: 50
Octet: 52
Octet: 49
Octet: 57
Octet: 9
Octet: 70
Octet: 82
Octet: 65
Octet: 78
Octet: 67
Octet: 79
Octet: 73
Octet: 83
Octet: 69
Octet: 1
Octet: 84
Octet: 0
Octet: 2
Octet: 83
Octet: 1
Octet: 1
Octet: 1
Octet: 48
Octet: 1
Octet: 49
Octet: 2
Octet: 56
Octet: 54
Octet: 1
Octet: 49
Octet: 9
Octet: 48
Octet: 66
Octet: 48
Octet: 50
Octet: 50
Octet: 49
Octet: 57
Octet: 53
Octet: 56
Octet: 1
Octet: 56
Octet: 24
Octet: 80
Octet: 72
Octet: 65
Octet: 82
Octet: 77
Octet: 65
Octet: 67
Octet: 73
Octet: 69
Octet: 32
Octet: 68
Octet: 85
Octet: 32
Octet: 67
Octet: 69
Octet: 78
Octet: 84
Octet: 82
Octet: 69
Octet: 50
Octet: 50
Octet: 49
Octet: 57
Octet: 53
Octet: 8
Octet: 48
Octet: 48
Octet: 50
Octet: 48
Octet: 50
Octet: 52
Octet: 49
Octet: 57
Octet: 1
Octet: 56
Octet: 0
Octet: 1
Octet: 48
Octet: 1
Octet: 49
Octet: 2
Octet: 53
Octet: 48
Octet: 2
Octet: 49
Octet: 48
Octet: 2
Octet: 48
Octet: 48
Octet: 1
Octet: 48
Octet: 1
Octet: 48
Octet: 1
Octet: 48
Octet: 1
Octet: 49
Octet: 1
Octet: 49

Est-ce que tu peux faire avec ça? les valeurs sont en decimale Taille sortie SSV_LireCartePS : 140 ZDonneesSortie: 0x1e75ad4cc40 Octet: 0 Octet: 1 Octet: 51 Octet: 1 Octet: 48 Octet: 1 Octet: 56 Octet: 11 Octet: 57 Octet: 57 Octet: 55 Octet: 48 Octet: 48 Octet: 53 Octet: 50 Octet: 52 Octet: 49 Octet: 57 Octet: 52 Octet: 1 Octet: 52 Octet: 2 Octet: 50 Octet: 50 Octet: 17 Octet: 80 Octet: 72 Octet: 65 Octet: 82 Octet: 77 Octet: 65 Octet: 67 Octet: 73 Octet: 69 Octet: 78 Octet: 48 Octet: 48 Octet: 53 Octet: 50 Octet: 52 Octet: 49 Octet: 57 Octet: 9 Octet: 70 Octet: 82 Octet: 65 Octet: 78 Octet: 67 Octet: 79 Octet: 73 Octet: 83 Octet: 69 Octet: 1 Octet: 84 Octet: 0 Octet: 2 Octet: 83 Octet: 1 Octet: 1 Octet: 1 Octet: 48 Octet: 1 Octet: 49 Octet: 2 Octet: 56 Octet: 54 Octet: 1 Octet: 49 Octet: 9 Octet: 48 Octet: 66 Octet: 48 Octet: 50 Octet: 50 Octet: 49 Octet: 57 Octet: 53 Octet: 56 Octet: 1 Octet: 56 Octet: 24 Octet: 80 Octet: 72 Octet: 65 Octet: 82 Octet: 77 Octet: 65 Octet: 67 Octet: 73 Octet: 69 Octet: 32 Octet: 68 Octet: 85 Octet: 32 Octet: 67 Octet: 69 Octet: 78 Octet: 84 Octet: 82 Octet: 69 Octet: 50 Octet: 50 Octet: 49 Octet: 57 Octet: 53 Octet: 8 Octet: 48 Octet: 48 Octet: 50 Octet: 48 Octet: 50 Octet: 52 Octet: 49 Octet: 57 Octet: 1 Octet: 56 Octet: 0 Octet: 1 Octet: 48 Octet: 1 Octet: 49 Octet: 2 Octet: 53 Octet: 48 Octet: 2 Octet: 49 Octet: 48 Octet: 2 Octet: 48 Octet: 48 Octet: 1 Octet: 48 Octet: 1 Octet: 48 Octet: 1 Octet: 48 Octet: 1 Octet: 49 Octet: 1 Octet: 49

Oui, ça va le faire :)
Je pousserais un bout de code intégrant ça

  • Intégrer un mock du vecteur d'octets, pour le debug
Oui, ça va le faire :) Je pousserais un bout de code intégrant ça - [ ] Intégrer un mock du vecteur d'octets, pour le debug
florian_briand requested changes 2024-07-17 13:35:44 +02:00
@ -0,0 +1,35 @@
// use std::ffi::CString;
  • Ne pas inclure ce fichier dans la PR
- [ ] Ne pas inclure ce fichier dans la PR
florian_briand closed this pull request 2024-07-29 22:02:20 +02:00

Pull request closed

Sign in to join this conversation.
No reviewers
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: P4Pillon/Krys4lide#17
No description provided.