Modifier

Le contexte

Je me suis mis à Rust il n'y a pas très longtemps et je suis tombé amoureux de ce langage. En général, je n'aime pas les relations compliquées, mais Rust m'a fait du charme et je n'ai pas su y résister.

Je travaillais donc avec WinDev et je me suis rendu compte que la gestion du YAML était buggé. Je pense que ce sera réglé un jour, mais je me suis dit que je pourrais corriger ça en utilisant le package YAML de Rust. J'ai donc réfléchi à comment faire dialoguer WinDev et Rust ensemble.

Je sais que WinDev peut manipuler des DLL et j'ai constaté que Rust peut générer des DLL. Cool, il ne reste plus qu'à trouver comment faire.

Cette histoire en plusieurs parties me servira d'aide mémoire pour la prochaine fois.

Créer une dll dans Rust

Coder la fonction

Pour créer une dll dans rust, c'est assez simple, il faut avoir un fichier lib.rs et dans ce fichier, une fonction qui renvoie un résultat. Pour me simplifier la vie, je pars du principe que ce sera toujours une chaîne de caractère (les prochains épisodes de cet article nous diront pourquoi, mais gardons le secret pour la prochaine fois).

Voici le code de la fonction dans le fichier lib.rs :

#[no_mangle]
pub extern fn call_rust() -> *const u8 {
    "hello world".as_ptr()
}
  • #[no_mangle] indique à Rust de ne pas modifier le nom de la fonction. On pourra ainsi appeler la fonction call_rust depuis notre projet WinDev.
  • pub extern indique que la fonction call_rust est publique et peut être appelé depuis la dll.
  • *const u8 indique que l'on retourne un pointeur vers une chaîne de caractère (je sais, ce n'est pas très explicite).
  • "hello world".as_ptr() convertit la chaîne de caractère en pointeur, et vu que l'on est en Rust, le return n'est pas obligatoire.

Configurer la dll

On va aller modifier le fichier Cargo.toml de notre projet et indiquer le code suivant

[lib]
name = "test_dll"
crate-type = ["cdylib"]
  • [lib] indique que l'on est en train de faire une bibilothèque
  • name = "test_dll" le nom de cette bibliothèque est test_dll
  • crate-type = ["cdylib"] indique que l'on va faire une bibliothèque compatible avec C

Créer la dll

On effectue un coup de cargo build --release et on se retrouve avec une jolie dll qui s'appelle test_dll.dll

Utiliser la dll dans WinDev

Créer le projet WinDev

Pour fonctionner, j'ai du créer un projet WinDev en 64 bits. La dll ne fonctionnait pas dans un projet 32 bits. Il doit surement y avoir une solution, mais je ne l'ai pas encore trouvée.

Appeler la DLL

C'est tout simple avec le code suivant :

address is system int = CallDLL32("Chemin\de\la\dd\test_dll.dll", "call_rust")
Trace(StringRetrieve(address, srASCIIZAddress))

Et un joli hello world s'affiche.

Conclusion

Et voilà, nous savons désormais créer une dll en Rust et l'utiliser avec WinDev. Je pensais que ce serait plus compliqué, et bien non ! Nous verrons dans le billet suivant comment créer une fonction qui nous permettra de remplacer la fonction Yaml de WinDev.

J'espère que le billet vous a plu. N'hésitez pas à partager vos tests et vos recommandations dans les commentaires.

Merci !

Article suivant Article précédent

Blog Comments powered by Disqus.