[TRIXI] Implementation C++

Ein LPCSTR ist ja ein Pointer auf einen Nullterminierten String.
Aber mit C geht es aber auch nicht, da kommt auch nur „0“ zurück.
Tommi

//---------------------------------------------------------------------------

#include <stdio.h>
#include <windows.h>
#pragma hdrstop

#include <tchar.h>
//---------------------------------------------------------------------------
typedef BOOL (* Connect)(LPCSTR, long);
#pragma argsused
int _tmain(int argc, _TCHAR* argv)
{
Connect ips_connect;
BOOL result;
BOOL fFreeResult;

// DLL Datei laden
HINSTANCE hinstLib = LoadLibrary(„TRIXI.dll“);

if (hinstLib) {
// Die Einsprungadresse abfragen
ips_connect = (Connect) GetProcAddress(hinstLib, „Connect“);

  // Die Funktion aufrufen
  if (ips_connect)
  	result = (*ips_connect) ("127.0.0.1",3773);

  // Die DLL-Datei wieder entladen
  fFreeResult = FreeLibrary(hinstLib);

}

// Das Ergebnis anzeigen
if (!hinstLib || !ips_connect) {
printf("Fehler: Konnte die Funktion nicht aufrufen
");
return 1;
} else {

  if ((result)) {
  	printf("Connect OK

");
}else{
printf("Connect Failed
");
}

  return 0;

}
}

//---------------------------------------------------------------------------

Ähh, das letzte Programm war reines (Borland-)C,nix Perl. Die Pointerumwandlung in meinem Perl-Programm macht das Win32::API-Modul mit dem Parameter „P“.
Es wäre jetzt interessant zu wissen, was in der DLL von den Parametern ankommt.

Tommi

Hab grad schon gesehen, dass das c war. Hab direkt meine IDE gestartet und experimentiert. Hab nostalgische Gefühle dabei bekommen so lange ist meine C++ Zeit nun schon her… :smiley:

Genau…


  char IPstr[] = "127.0.0.1";  // 1. String bauen
  char *pIP = IPstr;           // 2. Pointer drauf setzen

  result = (*ips_connect) (pIP, 3773);

So klappts…

Edit:

Bevor du die Lib frei gibst solltest du nen Disconnect machen. Hab sonst ne AV bekommen. Hab den kompletten Quellcode mal angehängt.

[Edit2]Anhang entfernt. Überarbeitete Version im 1. Beitrag angehängt[/Edit2]

Toni

Offtopic: Von wo läd Visual Basic im Debugmodus DLLs? Wenn ich die Exe starte reicht es wenn die DLL im selben Ordner liegt wie die EXE. Wenn ich den grünen Pfeil verwende (F5) dann fehlt ihm die DLL…

Mal geraten: Aus dem Verzeichnis wo vb.exe liegt und aus allen Direktories in %PATH%.

Leider gelingt es auch Deiner C-Version nicht sich bei mir zu connecten

Tommi

Nee, man muss unter Projekt, Eigenschaften, Debuggen den Visual-Studio Hostingprozess deaktivieren. doof

klappt es denn mit einer EXE aus der Demo? Ich mein, die üblichen Verdächtigen ausgeschaltet? Firewall, AntiVir, etc…

Nee, hast Recht. Zwei Stolpersteine sind mir aufgefallen…

  1. Bei Datei, Neu, Blablabla, Konsolenprogramm ist der Haken Multithreading wichtig (VCL hab ich mal auch angekreuzt, was glaub ich nicht nötig wäre). Das braucht das IPS SDK zwingend.

  2. Der blöde Hund findet die TRIXI.dll nicht weil er die EXE im Debug-Ordner erstellt. Ein Kopiervorgang löst das Problem.

Hab das komplette Projekt oben noch mal hochgeladen.

Toni

Deine Exe geht. Die Delphi-Versionen gehen auch. Aber wenn ich den gleichen C-Code mit mein Projekt kompiliere, gehts nicht.
Also neues Projekt gemacht, diesmal als CPP-Projekt mit VCL (vorher C ohne VCL), dann gehts. Es kommt aber am Ende ein Assertion Failure. Ohne VCL als CPP-Projekt gehts wieder nicht.

Möglicherweise klammpt es deshalb bei Helmut und bei meinem Perl nicht, weil wir dort kein MT und kein VCL einstellen können.
Hast Du es schon mal mit VisualC (MS) probiert?

Tommi

Also ohne MT kein IPS soviel kann ich schonmal sagen. Das liegt aber am IPS-SDK selbst.

An der VCL kanns nicht liegen, die hat VB auch nicht. Und bewusst verwende ich auch keine visuellen Komponenten.

Bin schon ein paar Jahre aus der Szene… Welche brauchbare c++ Freeware IDE kannst du empfehlen? C selbst hab ich nie gemacht. :rolleyes: Ist das so viel anders? Also für diesen Anwendungsfall jetzt?

Toni

Mit VC6 trotz Multithreading-Einstellung gehts auch nicht. Nun weiss ich nicht, an welchem der 50000 Schalter ich noch drehen muss. Ich hatte das C auch nur rausgeholt, um das Problem mit dem LPCSTR zu analysieren. Ich mache aber jetzt kein Compilersettings-Sadomaso, um das zum Laufen zu bringen. Hat mich so schon (zuviel) Zeit gekostet. Sonst nehme ich C auch nur, wenn ich anders nicht rankomme. Wenn es erstmal nur mit Delphi/VB geht, weiss ich ja Bescheid. Möglicherweise hat ja ein anderer der fleissigen Mitleser noch eine Erklärung.

Meine Empfehlung für Freeware-IDE: Codeblocks. Die neue Version 10 habe ich aber noch nicht installiert.

Tommi

Wo ist das Problem mit Codeblocks?
Ich verwende die Version (jetzt 10.05) mit mingw unter Windows, das spart das Einrichten von VC oder BCC.
Also mit Installer und default installieren , starten, dann neues Projekt-> Consolenanwendung-> „C“ auswählen, „Hello World“ ist dann sogar schon der Dummy-Eintrag, kompilieren, fertig, läuft.(siehe Anhang)

Tommi

Hello World.zip (10.2 KB)

Jupp. Neues Projekt erstellt. cout und system(„pause“) auf die Konsole, run… Nix passiert…

Ich schau morgen abend noch mal drauf…

So, Zwischenbericht - hatte grad ne Minute Zeit.

Ich wollte CodeBlocks mit meinem Borland Compiler füttern aber der wäre invalid sagte es mir dann. Ich mir also die CodeBlocks-mingw-Version heruntergeladen und „peng“ jetzt ist auch mein Borland-Compiler nicht mehr invalid… Das soll mal einer verstehen… :rolleyes:

Jetzt muss ich mich aber wieder erst wieder um meine Brötchen kümmern.

Toni

Hab Codeblocks eben verworfen. Ich bin zu alt/verwöhnt/blöd für diese Wissenschaft (oder Voodoo?) die sich Compiler-Switches nennt.

Das Beispiel vom 03.08. im Hauptthread mit dem C++Builder 2009 wird wohl vorerst mein einziger C++ Ausflug bleiben.

Toni