30

Moi j'ai ca..

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

...

Dim hWnd As Long
hWnd = FindWindow("TEmuWnd", "Virtual TI-89")
If hWnd = 0 Then
    hWnd = FindWindow("TEmuWnd", "Virtual TI-92+")
End If
If hWnd = 0 Then
    MsgBox "Virtual TI is not running!!", vbMsgBoxHelpButton, "Emulation"
End If


vous voulez pas m'écrire le code qu'il me reste à taper (ou à copier-coller smile ) pour envoyer le fichier "C:\test.89z" par exemple???
kiss
Tout ce qui passe pas par le port 80, c'est de la triche.

31

Ce n'est plus que du SendKeys. Il y a du code Delphi pour ça que tu peux traduire en VB dans TIGCC IDE (TMainForm.ExecuteCommandLine), mais sache qu'il est sous GPL.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

32

si il fallait respecter une licence comme la gpl a chaque fois que

1 -> On s'inspire d'un code ou d'un comportement d'un programme
2 -> on transforme completement le code

Ben tout les programmes de la terre serait en GPL sick
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

33

Bah, c'est l'idée...
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

34

Oui mais non neutral

la gpl ne marche pas pour tout neutral

Si tu vois un programme en GPL qui propose la fonction "rechercher" et que ça te donne l'idée de mettre une fonction rechercher dans ton programme, ton programme sera pas sous GPL aussi.

Si tu regarde le source d'un programme pour voir comment il fait qq chose (par ex utiliser les API windows pour taper des caracteres a VTI) et que tu implemente une version a toi, ton programme ne sera pas non plus en GPL !

Sinon va falloir convertir un paquet de programmees en GPL pasqu'il utilisent sendkey en VB trisotfl

la GPL ne couvre pas une ID, mais l'implémentation d'un code, cad comment il a été écrit
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

35

Si tu le traduis 1:1 en un autre langage, c'est toujours le même code.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

36

37

Kevin: non et comme le dit martial ça ne sera jamais du 1:1 et puis c'ext compltement débile pour la simple et bonne raison que bcp de choses on ne peut les faire que d'une seule maniere, donc si il fallait vérifier ce genre de choses triso
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

38

Si tu te bases sur un code Delphi, que tu le traduis 1:1 en VB et que tu changes 2-3 trucs après, ça reste une œuvre dérivée.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

39

Ok

donc je vais mettre le code suivant en gpl :


void main()
{
// Ce code est couvert par la licence GPL (cf http://www.fsf.org)
// This code is under the GPL
  printf("Hello World");
}


Tu vois ou je veux en venir ?
non ?
ben alros tu es vraiment irrécupérable neutral

avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

40

Tu vois ou je veux en venir ?

Hmm, c pas un brevet logiciel non plus...
C'est-à-dire que :
- si tu as trouvé comment faire un hello world par toi-même, l'existence de ce prog sous GPL n'influence pas ton prog
- tu peux réutiliser la méthode générale, mais pas l'implémentation... (genre si t'as une doc qui dit "ce programme fonctionne en définissant la fonction main(), qui appelle la fonction printf() pour afficher une chaîne", tu peux réécrire le soft avec la licence que tu veux)

Evidemment, ça pose plein de pbs :
- si par hasard tu as lu une implémentation GPL et que tu essayes après (indépendamment) de faire un truc du même style, tu es plus ou moins "contaminé", et c'est difficile de déterminer ce qui est légal ou pas...
- o<contrecul />ù s'arrête l'implémentation et où s'arrête l'idée ? il y a bien la solution du clean room design, mais c'est un peu lourd à mettre en place... (il faut que ça soit fait par des personnes différentes, etc...)

Donc malheureusement c'est très flou, oui, mais ça n'a rien de spécifique à la GPL... (enfin si, si tu mets ton code dans le domaine public y aura pas ce genre de problèmes ^^)


Menfin bon je pense surtout que ces notions n'ont un sens que sur des gros morceaux de code, là si c'est juste déterminer les 3 touches à faire pour envoyer un fichier à VTI... C'est pas non plus parce que c'est la GPL que c'est sacré, et si qqun disait sur un forum "il faut faire <f10>bla:\programme.89z<entrée><2nd-esc><2nd-left><shift-down>fold\programme()<entrée>" (je sais pas si ça suffit, hein happy), je pense que personne n'aurait vraiment de scrupules à l'implémenter (alors même qu'en principe les posts ont une licence bien plus restrictive que la GPL), donc voilà...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

41

bon les 9 derniers posts étaient HS.

comme declaration j'ai mis:
Public Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long


alors que l'API viewer me proposait ByRef pour lParam mais dans ce cas il était impossible d'envoyer 0 comme lParam.
et voici mon code qui normalement permet d'envoyer le fichier en utilisant la routine suggeré:

Static baytlar(0 To 150) As Byte 'il faut que ce soit une variable globale. Essayer avec "static b as byte()"

hwnd = FindWindow("TEmuWnd", "Virtual TI-89")
If hwnd = 0 Then
    hwnd = FindWindow("TEmuWnd", "Virtual TI-92+")
End If
If hwnd = 0 Then
    MsgBox "Virtual TI is not running!!", vbMsgBoxHelpButton, "Emulation"
End If


    Dim i As Integer
    Dim s As String
    s = "C:\nebulus.89z"
    For i = 1 To Len(s)
        baytlar(i - 1) = Asc(Mid(s, i, 1))
    Next i
 
    baytlar(Len(s)) = 0

SendMessage hwnd, &H233, VarPtr(baytlar(0)), 0


&H233 correspond à WM_DROPFILES. D'apres le programme SPY++ qui intercepe les messages, je recois un LRESULT: 00000000 (en hexa bien sur grin)



voici le code de VTI qui gère WM_DROPFILES, je sais pas si ca sert à quelque chose de l'avoir mais bon.
void __fastcall TEmuWnd::WMDropFiles(TMessage &Msg)
{
    HANDLE hDrop=(HANDLE)Msg.WParam;
    PauseStart();
    int fileCount=DragQueryFile(hDrop,-1,NULL,0);
    Screen->Cursor=crHourGlass;
    char name[256];
    for (int i=0;i<fileCount; )
    {
        DragQueryFile(hDrop,i,name,255);
        if (hw->SendFile(name,i<(fileCount-1)))
        {
            i++;
            continue;
        }
        Screen->Cursor=crDefault;
        if (MessageBox(Handle,"Transmission error","Error",
            MB_RETRYCANCEL|MB_ICONEXCLAMATION)==IDCANCEL)
            break;
        Screen->Cursor=crHourGlass;
    }
    DragFinish(hDrop);
    Screen->Cursor=crDefault;
    PauseEnd();
}


Voila, le probleme c'est que ca ne marche toujours pas. J'ai tout fait, essayé de changer en ByVal etc.. y a pas moyen de le faire marcher. Vous avez une idée de la ou ca peut venir?
Tout ce qui passe pas par le port 80, c'est de la triche.

42

A première vue
Public Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long
, ByVal lParam As Long) As Long


ça peut pas marcher parce que wParam ca parle d'un word sur deux octets donc je verrais plutôt
Public Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer
, ByVal lParam As Long) As Long


D'un autre coté voyons ce que veut VTI (bonne idée d'avoir mis le code)
HANDLE hDrop=(HANDLE)Msg.WParam
;


Donc VTI veut bien wParam, et ce qu'il veut c'est pas un pointeur vers une chaine, c'est un handle vers une structure contenant des infos sur le dragdrop, qu'il passe ensuite à la fonction chargée de récupérer les infos sur le d&d:
int fileCount=DragQueryFile(hDrop
,-1,NULL,0);


Donc ça peut pas marcher comme ça.

Regarde bien le code de VTI il doit y avoir un autre message qui charge un fichier.


Un conseil si tu fais de l'api en VB n'utilise JAMAIS byref.
Tout ce qui veut un byref ou un pointeur quelconque vers une structure quelconque, je te conseille de déclarer ça en ByVal pointeur as Long et d'utiliser varptr après, au moins tu es sur d'envoyer un pointeur.

Par exemple

Normalement RtlMoveMemory (byref dest as any, byref src as any, length as long) est censé marcher mais en fait non, parce que les variables sont transmises par défaut en ref quand rien n'est marqué donc il vaut mieux déclarer RtlMoveMemory(byval lpDest as long, byval lpSrc as long, byval length as long)
et ensuite utiliser RtlMoveMemory (varptr(var-dest), varptr(var-src), len(var-src) ) plutôt que RtlMoveMemory(var-dest, var-src, len(var-src))

Encore une fois, c'est censé marcher, mais à la pratique... non!

43

Merci bien ca m'éclaire bcp. love

Par contre je vois pas comment faire alors. Parce que je sais pas la structure de HDROP et en plus je suis pas sur que c'est transposable en VB meme si je le savais fou

Pour WParam c'est vrai que W fait plutot penser à 2 octets mais le Api viewer m'a suggeré un Long (tu va me dire il m'avait aussi suggeré un ByRef pour LParam gol ) mais regardez les messages de DROPFILES pour VTI.

Ca c'est quand on fait réellement un glisser déplacer "à la main"
messagepubli4jx.jpg

Ca c'est quand mon programme envoi le WM_DROPFILES:
messageenvoy1vh.jpg

Et la réponse envoyé par VTI:
messagerecu3ca.jpg


WParam semble être un Long non?
Et comment je fais pour HDROP??

Pour WParam HDROP, Microsoft nous dit
Handle to an internal structure describing the dropped files. Pass this handle DragFinish, DragQueryFile, or DragQueryPoint to retrieve information about the dropped files.

pour récupérer les infos mais il ne dit pas comment les créer..

(source: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/messages/wm_dropfiles.asp)
Tout ce qui passe pas par le port 80, c'est de la triche.

44

La visionneuse d'api part du fait que ByRef est censé marcher grin

DragDrop:
C'est le merdier sad

Apparemment si tu veux réussir il te faut reconstruire une struct HDROP en utilisant ce que tu trouveras dans shellapi.h (qui doit contenir la liste des fichiers)

Tu peux créer un struct en VB en utilisant
Type Nom
Champ as type
Champ as type
...
End Type

On accède aux champs en faisant a= Nom.Champ

Utilise ces traductions:
VB -- C
Byte -- char unsigned char int8 uint8 sint8 etc...
Integer -- HANDLE(? , à vérifier) short, unsigned short, int16, uint16, etc...
Long -- int, unsigned int , long int, char* short* struct* autres
Tous les pointeurs font 32 bits donc pour VB c'est un long

Bien sûr ça pose des problèmes en VB car les Byte sont unsigned alors que Integer et Long sont signed, mais c'est pour du stockage ce qui compte c'est d'avoir la taille.

Vérifie aussi que sizeof(wParam) = 2, on doit trouver ça dans les headers.
Et sizeof(HANDLE) parce que je suis pas sur. Sur TI ils font 16 bits, mais sur win...

45

C'est vrai que c'est le merdier.
Au passage je sais utiliser les struct en VB. Mais je suis pas sur que ca marchera, imagine il enregistre pas les champs dans le meme ordre que le compilo C..aie aie aie

Je vois pas ou trouver la structure d'une variable HDROP. Tout ce que je sais, cest pour pouvoir récuperer les trucs il faut le passer à DragQueryFile mais vu que moi je veux les créer et non pas les récuperer je m'en fous.
Si quelqu'un arrive à trouver la structure de HDROP, ca serait super sympa.

Quant aux HANDLE, moi je croyais que cétaient des pointeurs de pointeurs (--> donc 4 octets)

Je vais voir tout ca et je te dis, donc en attendant ca serait cool que quelqu'un me passe struct HDROP = {...
Merci bcp de consacrer du temps pour un tel probleme.
Tout ce qui passe pas par le port 80, c'est de la triche.

46

HDROP est un HANDLE (cf les handles sur TI). Ce n'est pas la même chose qu'une structure, mais je ne sais pas comment les créer sad
[Edit] Et si ça se trouve, on est même pas censé pouvoir le faire parce que c'est interne à Windows...
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

47

un handle c'est un pointeur vers une structure.

donc il se pourrait que ca fasse 32 bits en effet.

faut voir dans windows.h pour handle et dans shellapi.h pour hdrop.

48

un handle n'est pas forcément un pointeur. Ca peut être à peu près tout et n'importe quoi qui identifie l'objet. Son adresse, oui mais ça peut également être un index dans un tableau de pointeurs (comme les handles ti), un index sur un tableau d'objet, un hash, ...

49

Kevin m'a suggeré ca sur tigen:
Voilà le cycle de vie d'un HDROP:
1. Le programme source le crée. En VB, tu utilises la classe DataObject. Tu remplis cet objet avec les méthodes du VB. Tu peux ensuite appeler GetData(vbCFFiles) dessus pour avoir un HANDLE non-locké. Appelle GlobalLock sur ce HANDLE pour avoir ton HDROP. (Cf. http://www.codeproject.com/shell/shellextguide4.asp.)
2. Le programme source l'envoie en tant que paramètre de WM_DROPFILES.
3. Le programme de destination reçoit ce message, à condition d'avoir appelé DragAcceptFiles auparavant.
4. Le programme de destination appelle DragQueryFile, DragQueryPoint et/ou DragFinish.
Soit dit en passant que le VB encapsule les fonctions de Drag&Drop, tu n'es en général pas obligé de passer directement par l'API Win32. Du moins pour l'envoi, tu peux t'en passer. Tu crées le DataObject comme dans le 1., mais tu appelles YourControl.OLESetData avec cet objet, puis YourControl.OLEStartDrag. Pour la réception, pas tous les contrôles VB ne gèrent les fichiers nativement, c'est vrai, mais on doit pouvoir s'en sortir avec OLEDropMode etc.
Tout ce qui passe pas par le port 80, c'est de la triche.

50

L'encapsulage de VB ne nous concerne pas, ici ce qui nous intéresse c'est uniquement la création d'un HDROP. Ensuite, VTI se démerde.

Vala, on veut créer un hdrop.