les prototypes ne servent pas du tout à remplacer d'une quelconque manière les procédures.
leur utilisation est réservée à des cas assez particuliers.
ils servent entre guillemets à transformer une adresse d'une fonction en nom de fonction comme s'il s'agissait d'une commande purebasic ou d'une procédure.
Example :
Tu ouvres une DLL avec OpenLibrary.
Tu obtiens l'adresse de la fonction qui t'intéresse avec adresse = GetFunction(0, "NomDeLaFonction")
Tu appelles la fonction via son adresse avec CallFunctionFast(adresse,...)
Mais pour faire plus propre, plus pratique tu peux 'dire' à purebasic que 'adresse' sera implicitement utilisé en définissant un prototype plutot que d'utiliser CallFunctionFast().
L'aide PureBasic (fr) donne un petit example :
Prototype.l ProtoMessageBox(Window.l, Body$, Title$, Flags.l = 0)
If OpenLibrary(0, "User32.dll")
MsgBox.ProtoMessageBox = GetFunction(0, "MessageBoxA")
MsgBox(0, "Hello", "World")
EndIf
Par ailleurs, les prototypes sont aussi très pratiques quand ils sont utilisés avec l'API windows conjointement avec les 'pseudotypes' (voir l'aide).
Mais dans une programmation classique il n'est pas nécessaire de connaitre tout çà.