Codeumwandlung oder umstieg nach VB?

Anfängerfragen zum Programmieren mit PureBasic.
Metaller
Beiträge: 37
Registriert: 01.11.2006 13:20

Codeumwandlung oder umstieg nach VB?

Beitrag von Metaller »

Hallo Ihr da draussen :D

Ich habe seit letzten Freitag PrureBasic und bin mit dem Programm sehr, sehr zufrieden. Ich habe innerhalb von zwei Tagen ein Programm mit der MVCom Lib geschrieben um damit mit meinen Mikrocontroller zu sprechen. Dafür gibt es für PureBasic ein Daumen nach oben :allright:

Jetzt stehe ich vor dem Problem, dass ich die Daten, die ich von dem µC erhalte, einem anderen Programm übergeben muß. Dafür gib es Beispielcodes für div. Programmiersprachen unter anderem auch für VB. Ich glaube, dass ich den Sourcecode soweit verstanden habe wie er funktionieren soll. Nur jetzt möchte ich Ihn so umschreiben, das ich den Code in PB benutzen kann.

Mein Hauptproblem liegt in der Deklaration von Variabelen. Hier mal ein Ausschnitt:

Code: Alles auswählen

Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
        (Destination As Any, Source As Any, ByVal Length As Long)
 
Declare Sub ZeroMemory Lib "kernel32" Alias "RtlZeroMemory" _
        (Destination As Any, ByVal Length As Long)

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
        (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, _
        ByVal lpsz2 As String) As Long

Declare Function RegisterWindowMessage& Lib "user32" Alias _
        "RegisterWindowMessageA" (ByVal lpString As String)

Declare Function GetCurrentProcessId& Lib "kernel32" ()

Declare Function GlobalAddAtom% Lib "kernel32" Alias _
        "GlobalAddAtomA" (ByVal lpString As String)

Declare Function CreateFileMapping& Lib "kernel32" Alias _
        "CreateFileMappingA" (ByVal hFile As Long, _
        ByVal lpFileMappingAttributes As Long, ByVal _
        flProtect As Long, ByVal dwMaximumSizeHigh As Long, _
        ByVal dwMaximumSizeLow As Long, ByVal lpName As String)
So wie ich das sehe, kann ich die Funktionen mit den Lib-Funktionen ansprechen, nur leider finde ich die Erklärung dazu für mich etwas dürftig. Kann mir jemand eine Zeile in PB umsetzen, damit ich sehen kann bie sotewas aussehen könnte oder mir ein Tutorial nennen in dem in das nachlesen kann?

Der nächste Schritt wäre die Umwandlung der Anweisungen/Funktionen. Da hätte ich z.B. die Möglichkeit den C Quellcode aus dem SDK des Programmes zunehmen und das dann in eine *.dll umwandle und auf die Funktionen per PB zugreife. Die Umwandlung würde ich mit Visual C++ machen, was ich mir vor etwa zwei Jahren zugelegt habe.
Alternative würde ich den VB-Code direkt in PB umwandeln, was aber sehr arbeits intensiv wäre und vom abtippen ist noch keiner schlauer geworden.

Ich würde mich freuen, wenn mich jemand in die richtige Richtung stoßen könnte :wink: Wenn es aber keine Möglichkeit gibt den Code für PB umzuschreiben, dann bleibt mir leider keine andere Wahl als PB in die Tonne zudrücken und VB mir zu zulegen, was ich sehr bedauern würde, denn ich habe noch keine Programmiersprache so schnell verstanden wie PB. Bitte helft mir. Danke.

Schönen Gruß... Metaller
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Codeumwandlung oder umstieg nach VB?

Beitrag von Kiffi »

> Mein Hauptproblem liegt in der Deklaration von Variabelen.

das sind API-Deklarationen. Du musst in PB nichts weiter machen, als den
entsprechenden API-Befehl mit einem Unterstrich am Ende versehen
(Beispiel: FindWindowEx_()). Mancher Befehl ist auch schon als nativer
PB-Befehl vorhanden (siehe: CopyMemory() in der Hilfe).

Grüße ... Kiffi

P.S.: Ein VB6 heutzutage zu kaufen könnte schwierig werden. ;-)
a²+b²=mc²
Metaller
Beiträge: 37
Registriert: 01.11.2006 13:20

Beitrag von Metaller »

Also wenn ich Dich jetzt richtig verstanden habe, dann sollte es z.B. so aussehen:

Aus:

Code: Alles auswählen

Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
        (Destination As Any, Source As Any, ByVal Length As Long)

Declare Sub ZeroMemory Lib "kernel32" Alias "RtlZeroMemory" _
        (Destination As Any, ByVal Length As Long) 
wird:

Code: Alles auswählen

Global Destination.l
Global Source.l
Global Length.l

Declare CopyMemory_(Destination, Source, Length)
Declare ZeroMemory_(Destination, Length)
Ist das richtig so?
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Nein, du brauchst die garnichtmehr deklarieren.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

zieh dir mal die win32.hlp und pack sie in deinem PB-Verzeichnis in ein Unterverzeichnis "Help"
dann kannst du zu vielen API-funktionen per F1 kontexthilfe bekommen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Metaller
Beiträge: 37
Registriert: 01.11.2006 13:20

Beitrag von Metaller »

Ok, ok :) Ich glaube, dass ich es so langsam raffe. Nächster Versuch:

Code: Alles auswählen

aus:
Call ZeroMemory(ByVal m_pNext&, 4)

wird:
ZeroMemory_(*m_pNext, 4)
Zusätzlich lasse ich das ganze Dekarations-Gezuppel wech und rufe die Funktion direkt auf. Selbstverständlich habe ich den Zeiger vorher initialisiert :wink:

Jetzt richtig? :oops:
Metaller
Beiträge: 37
Registriert: 01.11.2006 13:20

Beitrag von Metaller »

Wo ist nur meine Erziehung geblieben :cry: Ich habe im Moment nur dieses Problem vor Augen und habe dadurch vergessen mich für Eure Hilfe zu bedanken, was ich hiermit nachholen möchte. Vielen Dank. Bitte verzeiht mir das.

Der Tipp mit der win32.hlp habe ich schon umgesetzt. Aber zusätzlich benutze ich noch den "API-Guide 3.7".
Metaller
Beiträge: 37
Registriert: 01.11.2006 13:20

Beitrag von Metaller »

Ich bin gerade dabei das Programm unzuschreiben. Dabei bin ich auf weitere kleine Probleme gestoßen. Bei der Initialisierunmg der Konstanten werden verschiedene Zahlenzuweisungen benutz, die ich nicht ohne weiters verstehe.

Was bedeutet:
1. &H1 (könnte das eine hexadezimale Zahl sein?)
2. 4&
3. &H7F00& (könnte das auch eine hexadezimale Zahl sein, aber was macht das zweite & da? evtl. ein Zeiger?)
4.

Code: Alles auswählen

' define the DWORD type for VB
Public Type DWORD
  Byt0 As Byte
  Byt1 As Byte
  Byt2 As Byte
  Byt3 As Byte
End Type
Könnte das eine Struktur sein?

Wäre schön, wenn Ihr mir dabei auch wieder helfen könntet.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

4. ja, das ist ne struct.

Code: Alles auswählen

Structure DWORD
  Byt0.b
  Byt1.b
  Byt2.b
  Byt3.b
EndStructure
den typ LONG (=DoubleWord) gibt es in PB allerdings schon.
ich würde mal in den betreffenden code schaun,
ob überhaupt die einzelbytes über die struktur angesprochen werden,
wenn nicht, kann man schlicht drauf verzichten, diese struct zu erzeugen,
und gleich Long nehmen.

3. ist eine hexadezimalzahl
das zweite & hab ich keinen plan, is zu lang her, dass ich was mit VB gemacht hab.
ist evtl. ein Typ, so wie auch # und ! in VB typenkennungen sind.
&H7F00 scheibt man in PB einfach $7F00

2. wieder die mögliche typenkennung

1. ist es. $01 , $00000001 oder einfach 1, wie es beliebt.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Beitrag von tobe »

hi,

laut http://www.vbarchiv.net/faq/allg_variablen.php ist das & scheinbar nur ein veraltetes Typenkennzeichen (für long).
PureBasic 4.40 (Windows - x86)
Antworten