Laden...

Forenbeiträge von S.R. Ingesamt 221 Beiträge

09.03.2010 - 13:41 Uhr

Hi,

danke - das ist ja schon mal ein Ansatz. Wenn ich in diesem Forum suche, dann finde ich nur noch einen Beitrag, der Jumplist enthält. Fragen wir mal Google und MSDN 😃

Hab noch einen Screen vom Media-Player angehängt - zur Vervollständigung.

Dankend

Stefan

09.03.2010 - 13:31 Uhr

Hallo Leute,

ich habe ein Programm, was auch unter Windows 7 ausgeführt werden soll. Hier gibt es ja die neue Windows-Leiste, in der mein Programm erscheint. Diese Anzeige möchte ich erweitern. Hier gibt es zwei Wünsche:

  • Buttons wie beim Media Player einbauen
  • Rechte-Mausklick-Eingenschaften wie beim IE einbauen

Ich such mich schon dumm und dämlich und find nix brauchbares. Ich glaub mir fehlen einfach die richtigen Suchbegriffe. Hat die neue Windows-Leiste evtl. einen speziellen Namen? Da muss man doch sicherlich nur eine bestimme DLL ansprechen und schwupps ist man fertig - so zumindest mein Traum 😃

Kann mir hier jemand auf die Sprünge helfen und mir ein paar Ansatzpunkte nennen. Vielen lieben Dank dafür

Stefan

03.03.2010 - 09:53 Uhr

Hi,

vielen Dank für eure Tipps - Stand der aktuellen Analyse ist, dass durch das Einlesen mit falschem Encoding Informationen verlohren gehen. Der Hersteller der Komponente wird jetzt seine DLL anpassen, so dass hier auch per Parameter das entsprechende Encoding übergeben werden kann.
Alles andere ist denk ich auch sch*** - weil meiner Überzeugung nach, sollte man das Problem immer an der Wurzel angehen und net durch Workarounds irgendwas ans Laufen kriegen 😃

Dankend!!!

Stefan

02.03.2010 - 22:04 Uhr

Hallo,

ich habe ein konkretes Problem beim Encoding und komme leider nicht weiter und bin da auf eure Hinweise angewiesen...

Im Code wird eine Textdatei eingelesen:

data = File.ReadAllText(inputFileName);

Wenn ich mir dann "data" anschaue, dann werden die Sonderzeichen falsch dargestellt. Wenn ich dann allerdings

data = File.ReadAllText(inputFileName, Encoding.Default);

nutze, dann werden auch die Sonderzeichen richtig dargestellt. Das Default hat den Wert ISO-8859-1 (CodePage 1252).

Jetzt habe ich allerdings das Problem, dass ich die File.Read nicht mit Encoding nutzen kann, da dieser Teil in einer externen Komponente liegt und ich nur den fertig eingelesenen data-String bekomme. Ich bastel gerade an einer Convertierungsfunktion: data = ConvertToUTF8(data);

Laut MSDN kann ReadAllText ohne Encoding nur UTF-8 und UTF-16 erkennen. Somit müsste ja der data-String den ich bekomme auch UTF-8 sein, oder? Aber der ist ja falsch - also müsste ich von UTF-8 nach ISO oder wie?

Ich blick da net durch, wo wie was welche Codierung hat 😃 Am Ende möchte ich "nur" einen korrekten UTF-8-string, d.h. wo auch alle Sonderzeichen korrekt drin stehen.

Bin für jeden Tipp dankbar! Dankend

Stefan

26.01.2010 - 23:39 Uhr

Hi,

hast du schon mal mit pdflatex gearbeitet? Bin da gerade dran am Verzweifeln...

Habe mir die kompilierten dlls und exen von TeX Live heruntergeladen und dort ist ja auch die pdftex dabei. Der verlangt dann aber noch .fmt-Dateien. Diese habe ich mir dann auch auf einer anderen Webseite gezogen. Anschließend hab ich noch die texmf.cnf auf den Sourcen genommen. Jetzt krieg ich folgende Fehlermeldung

D:\Neuer Ordner>pdftex story
This is pdfTeX, Version 3.1415926-1.40.10 (Web2C 2009)
(Fatal format file error; I'm stymied)

Lade mir gerade das komplette Tex Live herunter - sind aber geniale 2 GB. Mal schauen was das alles ist.

Wenn du also Tipps hast, was ich besser machen könnte bzw. weißt, was ich machen musst, dann wäre ich dir sehr dankbar, wenn du mir dies posten könntest 😃

Vielen Dank

Stefan

26.01.2010 - 21:31 Uhr

Hi,

vielen Dank für deinen Post. Wie das mit einem Editor funktioniert ist mir klar. Allerdings möchte ich diesen nicht verwenden. Ich möchte dies automatisiert über ein C-Sharp-Programm realisieren.

Ziel ist sozusagen ein DLL/Exe-Aufruf wie folgender:

TexToPdf.exe "Input.tex" "Output.pdf"

Hast du dafür auch noch einen guten Tipp auf Lager?

Dankend

Stefan

26.01.2010 - 17:03 Uhr

Hallo,

habe zur Umwandlung von LaTex-Dokumenten nach PDF eine Frage. Ziel ist es, dass ein Fachmann Latex-Dokumente erstellt, ich diese erhalte und in diesem "Text-File" einige Text-Bausteine ersetze. Diese "überarbeitete Dokument" soll dann in PDF umgewandelt werden, damit es auf einem Rechner mit dem Acrobat Reader geöffnet werden kann.

Die Frage stellt sich nun: wie kriege ich am leichtesten das Latex-Dokument in PDF umgewandelt? Hat dort jemand eine Idee. Habe schon von pdflatex gehört, aber noch nichts wirklich brauchbares gefunden, wie ich dies korrekt einbinde.
Wenn jemand eine Firma kennt, die solch eine "Umwandlungs-Komponente" verkauft, dann bin ich auch nicht abgeneigt, die Komponente zu kaufen.

Vielen Dank für eure Tipps und Ratschläge

Stefan

19.12.2009 - 12:31 Uhr

Hallo,

für die Ermittlung der IP-Adresse von einer URL verwende ich folgende Funktion:

try
            {
                IPHostEntry hostEntry = Dns.GetHostEntry(Server);
                string ipAddresses = "";
                for (int i = 0; i < hostEntry.AddressList.Length; i++)
                {
                    ipAddresses += hostEntry.AddressList[0].ToString();
                    if ((hostEntry.AddressList.Length > 1) && (i < hostEntry.AddressList.Length - 1))
                        ipAddresses += ", ";
                }
            }
            catch (Exception ex)
            {
                Console.Write(ex.Message);
            }

Dies funktioniert auch auf mehreren hunderten (Kunden-)Rechnern problemlos. Nun haben wir allerdings einen Kunden, bei dem folgende Exception ausgegeben wird:

Dieser Vorgang wird nur von Windows 2000 SP3 und späteren Betriebssystemversionen unterstützt.

Der Kunde hat aber definitiv Windows XP mit SP3!

Daraufhin habe ich mir seine Rechnerkonfiguration angeschaut:

  • Windows Firewall deaktiviert
  • Avira Antivir deaktiviert
  • Applikation als Administrator gestartet
    => nichts, immer der gleiche Fehler

Anschließend habe ich dann die Netzwerkkonfiguration unter Beobachtung gestellt:
Es sind zwei DNS-Server eingetragen: 195.50.140.178 und 195.50.140.114. Laut Recherche sind dies zwei DNS-Server von Arcor: dns11.arcor-ip.de und dns5.arcor-ip.de.

Wenn der Kunde in seiner CMD "nslookup MeinServer.de" eingibt, bekommt er folgendes Ergebnis:

Server: dns11.arcor-ip.de
Address: 195.50.140.178
Nicht autorisierte Antwort:
Name: MeinServer.de
Address: korrekte IP

Daher behaupte ich, dass bei ihm grundsätzlich DNS korrekt funktioniert - immerhin kann er auch ganz normal Surfen und sich auch sonst ohne Probleme im Internet bewegen.

Daher habe ich bei mir lokal in die CMD eingegeben "nslookup MeinServer.de dns11.arcor-ip.de" und bekomme dann folgendes Ergebnis:

DNS request timed out.
    timeout was 2 seconds.
Server:  UnKnown
Address:  195.50.140.178

DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
\*** Zeitüberschreitung bei Anforderung an UnKnown.

Dies liegt vermutlich daran, dass Arcor nicht möchte, dass Nicht-Arcor-Kunden auf deren DNS-Server zugreifen (nur eine Vermutung). Allerdings gibt mir eine Anfrage an dns4.arcor-ip.de eine korrekte Antwort zurück.

Soweit meine ergatterten Informationen und Recherchen. Hat jemand von euch eine Idee, woran dies liegen könnte? Noch besser wäre natürlich eine Lösung für das Problem 😃

Dankend

Stefan

20.08.2009 - 13:15 Uhr

Hi,

vielen Dank für eure schnellen Antworten. Die bringen mich weiter. Bin schon fleißig dabei!

Dankend

Stefan

20.08.2009 - 11:23 Uhr

verwendetes Datenbanksystem: MySQL

Hallo,

grundsätzlich sind mir die Optimierungen einer MySQL geläufig, stehe aber nun vor einem Problem, wo ich etwas Unterstützung brauche:

Meine C-Sharp Klasse ist ein MySQL-Datenbank-Handler. Diese Klasse hat eine Funktion "TryAddItemToDatabase(...)". Diese Funktion wird an vielen anderen Stellen der Applikation aufgerufen. Folgendes Problem (deswegen Try...) kann nun auftreten: Der Datensatz, der eingetragen werden soll, existiert schon. Daher muss ich im ersten Schritt prüfen, ob dieser Datensatz schon in der DB vorhanden ist. Diese Tabelle hat allerdings knapp 1 Mio Einträge und daher dauert dies aktuell etwas lange.

Die Datenbank sieht im folgenden so aus:
id: int
x, y, z (+ knapp 30 andere Einträge): string/date/int Werte

Wenn ein Eintrag mal erstellt worden ist, dann wird dieser über die ID indentifiziert, daher hat diese Spalte einen Index mit Primary. Dies geht somit super schnell. Langsam ist nur die Überprüfung, ob der Datensatz schon existiert. Dies mache ich mit einem "SELECT id FROM tabelle WHERE >>alle Werte<<".

Hier sind dann keine Indexe mehr gesetzt und daher muss die DB ja alle Datensätzen durchgehen, daher dauert das so lange. Jemand einen Tipp, wie man dies schneller hinbekommt?

Dankend

Stefan

05.08.2009 - 11:01 Uhr

Hi,

@Siassei:
genauso sehe ich das auch. Das muss einfach n' Bug sein 😃

@Spook:
Klappt reibungslos! Vielen Dank dafür.

Damit hätten wir schon wieder eine Sorge weniger.

Bis demnächst...

Stefan

02.08.2009 - 13:51 Uhr

Hi,

das ist doch genau das Beispiel von meinem zweiten Post - bei mir halt ohne Kommentare und ohne die Icon-Umwandlung. Allerdings funktioniert das ganze bei mir nicht.

Daher bin ich immer noch auf der Suche nach einer Funktion, die das macht, was ich brauche.

Dankend

Stefan

01.08.2009 - 11:16 Uhr

Hi,

habe meinen Code nun wie folgt angepasst:

Bitmap bmp1 = (Bitmap.FromFile("d:\\test-1.bmp") as Bitmap);
  ImageCodecInfo myImageCodecInfo = GetEncoderInfo("image/bmp");
  System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.ColorDepth;

  EncoderParameters myEncoderParameters = new EncoderParameters(1);
  myEncoderParameters.Param[0] = new EncoderParameter(myEncoder, 16L);
  bmp1.Save("d:\\result.bmp", myImageCodecInfo, myEncoderParameters);

Leider ist das Ergebnis weiterhin, dass result.bmp genauso groß ist und die gleiche Auflösung hat wie test-1.bmp. Hat jemand einen weiteren Tipp auf LAger, was hier schief läuft?

Dankend

Stefan

31.07.2009 - 13:47 Uhr

Hi,

vielen Dank für den Link. Habe schon gegoogeld - keine Sorge, aber leider nicht das gefunden, was ich gesucht habe. Habe den Code nun wie folgt stehen:

Bitmap bmp1 = (Bitmap.FromFile("d:\\test-1.bmp") as Bitmap);
Rectangle r = new Rectangle(0, 0, bmp1.Width, bmp1.Height);
Bitmap bmp = bmp1.Clone(r, PixelFormat.Format16bppArgb1555);
bmp.Save("d:\\te.bmp", ImageFormat.Bmp);

Jetzt müsste doch mein bmp eine 16-bit Bmp-Datei sein und dementsprechend deutlich kleiner (vom Speicherplatz her) als die original-Datei, oder? Dies ist allerdings nicht der Fall und daher frag ich mich - was mache ich falsch?

Hat jemandn n' Tipp auf Lager?

Dankend

Stefan

31.07.2009 - 07:39 Uhr

Hallo,

ich habe hier auf der Festplatte eine Grafik-Datei "test.bmp". Diese hat das Pixelformat "Format32bppArgb". Nun möchte ich ein neues Bitmap erstellen, allerdings mit dem Pixelformat "Format16bppArgb15555" und dann das ganze unter test2.bmp abspeichern.

Hat jemand von euch n' Idee wie ich dies gepacken bekomme? Stehe da was auf dem Schlauch und bin mit meinen Ansätzen am Ende 😃

Danke

Stefan

28.07.2009 - 11:49 Uhr

Hi,

vielen Dank für deinen Eintrag, auch wenn ich aktuell damit nichts anfangen kann, weil ich rein gar nix davon verstehe 😃

Versuche gerade das Problem zu vereinfachen, um so ans Ziel zu kommen. Anstatt ein Array von meinem eigenen Record/Struct zu übergeben, möchte ich erst Mal nur ein Array von Int32 übergeben. Das sollte doch zumindest problemlos schaffbar sein, oder?

Aber auch in diesem Falle bleiben die Ergebnisse gleich. Ich rufe die Delphi-Funktion auf, mache sozusagen nichts und zack ist das Array in C-Sharp nur noch von der Länge eins. Da geht also einiges schief - selbst bei der einfachen Struktur.

Verständnisfrage:
Wenn ich "Int32[] changes" habe und dies dann mit "ref changes" übergebe, dann sollte doch in Delphi ein Pointer auf den ersten Eintrag in dem Array ankommen, oder?
Was ich dann nicht verstehe - wenn in Delphi doch nur ein Pointer ankommt (wegen Referenz) und in der Routine nix gemacht wird, wieso ist in C-Sharp dann das Array nur noch von der Länge 1 (nach Delphi-Funktion-Aufruf).

Dankend

Stefan

28.07.2009 - 10:45 Uhr

uups - copy-past-fehler 😃 da steht natürlich was anderes:

TPixelInformations = array of TPixelInformation

Das stammte noch aus Test-Zeiten, wo ich nur ein Record/Struct übergeben habe. Das hatte nämlich reibungslos funktioniert. Nur mit dem Array steh ich auf Kriegsfuß 😃

Dankend

Stefan

28.07.2009 - 08:51 Uhr

Hi,

habe nun noch folgendes Problem in Zusammenhang mit der Dll und der Übergabe zu lösen, wo es leider noch knallt:

Die C-Sharp-Applikation soll der (Delphi-)DLL ein eindimensionales Array zur Verfügung stellen (gerne auch noch ein Int mit der Größe des Arrays). In dieses Array schreibt die Applikation ihre Daten und beendet sich dann. Das Array muss vom Type PixelInformation sein, was wie folgt aufgebaut ist:

        private struct PixelInformation
        {
            public Int32 x;
            public Int32 y;
            public Byte Red;
            public Byte Green;
            public Byte Blue;
        }

Bisher wird das ganze so übergeben:

        private static extern Int32 CompareTwoBitmaps(Int32 Width, ref PixelInformation[] changes);

PixelInformation[] changes = new PixelInformation[5];

Int32 tmp = CompareTwoBitmaps(5, ref changes);

Allerdings kommt damit Delphi nicht ganz klar und endet mit einer Exception. Der Code in Delphi sieht bisher wie folgt aus (und muss vermutlich ebenfalls angepasst werden):

  TPixelInformation = packed record
    x: Integer;
    y: Integer;
    red: Byte;
    green: Byte;
    blue: Byte;
  end;
  TPixelInformations = TPixelInformation;

function CompareTwoBitmaps(const Width, var Changes: TPixelInformations): Integer; stdcall;
begin

end;

Wie man sieht, macht die Delphi-Funktion bisher nichts und trotzdem tritt folgender Fehler auf:

Vor dem Aufruf der DLL ist changes 25-Dimensionen groß, nach dem Aufruf der DLL nur noch eine. Da scheint also schon irgendwas am Ansatz nicht zu stimmen. Bin dankbar für jeden Tipp, wie ich hier korrekt das Array in Delphi (in Kombination mit C#) richtig füllen kann.

Dankend

Stefan

27.07.2009 - 19:00 Uhr

Hi,

wer suchet der findet - danke! Damit bin ich gerade einen riesen Schritt weiter gekommen.

Schönen Abend wünscht euch allen

Stefan

26.07.2009 - 18:53 Uhr

Hi,

vielen Dank für eine Mühen, aber bist du dir mit LockBits sicher?

Bin dies grad am Umsetzen und habe in C-Sharp die Funktion wie folgt definiert:

[DllImport("BitmapCompare.dll", EntryPoint = "CompareTwoBitmaps", CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
private static extern Int32 CompareTwoBitmaps(IntPtr Bitmap1, IntPtr Bitmap2);

Der Aufruf-Code sieht dann wie folgt aus:

Bitmap bmp1 = (Bitmap.FromFile("d:\\t1.bmp") as Bitmap); // GetDesktopImage();
Bitmap bmp2 = (Bitmap.FromFile("d:\\t2.bmp") as Bitmap);

CompareTwoBitmaps(
  bmp1.LockBits(new Rectangle(0, 0, 5, 5), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb),
  bmp2.LockBits(new Rectangle(0, 0, 5, 5), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb));

Die Funktion LockBits liefert allerdings die Klasse BitmapData zurück. Daher kommt es dazu einem Compiler-Fehler, da BitmapData nicht in IntPtr konvertiert werden kann.

Hast du n' Idee, wo da der Fehler liegt? stehe da grad was auf dem Schlauch - dankend

Stefan

24.07.2009 - 10:50 Uhr

Hi,

da magst du Recht haben 😃 Allerdings kenne ich mich bis dato nicht mit den Tastatur-Layouts aus und da wäre es natürlich schön gewesen, wenn man sich die Einarbeitung in diesen Themenblock hätte sparen können, wenn man nur eine Zeile Code hätte anpassen müssen.

Naja - schauen wa mal weiter - schadet sichlich nicht, sich mal mit Tastatur-Layouts befasst zu haben - vielleicht zeigt es einem ja auch noch neue Möglichkeiten, seine Software mit ein paar neuen Features zu verbessern 😃

Nochmals vielen Dank für eure Mühen. Habe jetzt erst Mal einige Ansätze, die ich abarbeiten kann und falls ich weitere Sorgen haben, dann komme ich natürlich wieder grins

Dankend

Stefan

23.07.2009 - 22:34 Uhr

Hi,

vielen Dank für eure Hilfe. Die Dll bietet noch eine weitere Möglichkeit, die Daten anzunehmen. Der Delphi-Code sieht dafür wie folgt aus:

unction CompareTwoBitmaps(const Width, Height: Integer;
  Bitmap1, Bitmap2: PRGBQuad): Integer; stdcall; external 'BitmapCompare.dll';

procedure TForm1.ExecuteButtonClick(Sender: TObject);
var
  img1, img2, res: TBitmap;
  P1, P2: PRGBQuad;
begin
  img1 := TBitmap.Create;
  img2 := TBitmap.Create;

  img1.LoadFromFile(Bitmap1Edit.Text);
  img2.LoadFromFile(Bitmap2Edit.Text);

  img1.PixelFormat := pf32bit;
  img2.PixelFormat := pf32bit;

  P1 := img1.ScanLine[img1.Height - 1];
  P2 := img2.ScanLine[img2.Height - 1];

  CompareTwoBitmaps(img1.Width, img1.Height, P1, P2);
end;

(Hier gibt es zwar noch keinen Rückgabewert, das ist aber momentan auch egal - bild wird im Tmp-Verzeichnis gespeichert)

Jetzt stehe ich aber auf dem Schlauch, wie ich diesen Übergang in Delphi einbauen soll - eine für mich noch unlösbare Aufgabe. Wenn ich das richtig sehe, dann ist P1 und P2 ein Pointer auf eine ganz simple Struktur:

  PRGBQuad = ^TRGBQuad;
  {$EXTERNALSYM tagRGBQUAD}
  tagRGBQUAD = packed record
    rgbBlue: Byte;
    rgbGreen: Byte;
    rgbRed: Byte;
    rgbReserved: Byte;
  end;
  TRGBQuad = tagRGBQUAD;
  {$EXTERNALSYM RGBQUAD}
  RGBQUAD = tagRGBQUAD;

Diese habe ich wie folgt in C-Sharp nachgebaut:

public struct TRGBQuad
{
  Byte rgbBlue;
  Byte rgbGreen;
  Byte rgbRed;
  Byte rgbReserved;
}

Allerdings habe ich keinen Plan, wie ich da jetzt n' Pointer-Array machen soll, was als Übergabe erwartet wird. In Delphi kann ich mit den Bilddaten wie folgt umgehen:

P1.rgbRed => direkt den Rot-Wert abrufen
Inc(P1) => Pointer eins hochzählen => gehe ins nächste Feld. Das Feld ist wie folgt aufgebaut: Bild unten links ist der erste Eintrag - mit dem Hochzählen komme ich nach rechts, dann springt man eine Zeile nach oben und fängt dort wieder links an - also eine Art Band, wo alle Pixel hintereinander stehen.

Allerdings habe ich noch keinen Plan, wie ich dieses ScanLine in C-Sharp umsetzen soll. Dazu habe ich noch nichts passendes gefunden. Hat da von euch jemand einen Tipp?

Dankend

Stefan

23.07.2009 - 18:41 Uhr

Hallo,

vielen Dank für deine Hilfe. Mit den Konstanten sollte eigentlich egal sein - weil diese ja nur verhindern, dass der Wert überschrieben wird. Trotzdem werde ich dies mal testen.

Welche Klasse kann ich denn unter Delphi und/oder C# verwenden, dass hier eine reibungslose Kommunikation stattfindet? Da ich Zugriff auf den Delphi-Code habe kann ich hier auch schauen, in wie weit sich hier "schnell" der Datentyp anpassen lässt.

Vielen Dank für eure Mühen

Stefan

23.07.2009 - 16:50 Uhr

Hallo,

ich habe hier eine externe DLL, die in Delphi 7 geschrieben ist. Diese bekommt zwei Bitmaps übergeben und liefert dann ein Bitmap als Ergebnis zurück. Wie die DLL aus Delphi (ohne Fehler) aufgerufen wird, zeigt folgender Code:

function CompareTwoBitmaps(const Bitmap1, Bitmap2: TBitmap): TBitmap; stdcall; external 'BitmapCompare.dll';

procedure TForm1.ExecuteButtonClick(Sender: TObject);
var
  img1, img2, res: TBitmap;
begin
  img1 := TBitmap.Create;
  img2 := TBitmap.Create;

  img1.LoadFromFile(Bitmap1Edit.Text);
  img2.LoadFromFile(Bitmap2Edit.Text);

  res := CompareTwoBitmaps(img1, img2);
  res.SaveToFile('d:\res.bmp');
end;

Nun soll ich das gleiche in C-Sharp realisieren - also die Einbindung der DLL. Bisher habe ich folgendes gemacht:

[DllImport("BitmapCompare.dll", EntryPoint = "CompareTwoBitmaps", CharSet = CharSet.Ansi, ExactSpelling = true,
            CallingConvention = CallingConvention.Winapi)]
private static extern Bitmap CompareTwoBitmaps(Bitmap Bitmap1, Bitmap Bitmap2);

itmap bmp1 = (Bitmap.FromFile("d:\\t1.bmp") as Bitmap);
Bitmap bmp2 = (Bitmap.FromFile("d:\\t3.bmp") as Bitmap);

Bitmap bmp3 = CompareTwoBitmaps(bmp1, bmp2);
bmp3.Save("d:\\result.png", System.Drawing.Imaging.ImageFormat.Png);

Dann erhalte ich allerdings an der Stelle, wo CompareTwoBitmaps aufgerufen wird, folgende Exception:

Eine Ausnahme vom Typ "System.ExecutionEngineException" wurde ausgelöst.

Auf die gleiche Weise habe ich schon mal eine andere Delphi-Dll eingebunden - ohne Probleme, allerdings wurden da nur Integer bzw. String übergeben und kein so "komplexes Objekt" wie Bitmap.

Hat jemand von euch n' Ahnung, wie ich das ganze in den Griff kriege.

Dankend

Stefan

21.07.2009 - 22:52 Uhr

Hi,

zweiter Test, den ich grad durchgeführt habe - der nur zur Auswertung dient:

Wenn ich eine Form nehme und dort das Ereignis KeyDown setze, dann kann ich dort sehe, dass nach Windows-Tasten-Druck erst das PopUp-Menü von Windows hochgeht und ich dann im Breakpoint in der KeyDown-Funktion lande.

Ob dieser Test allerdings meine Theorie "erst Windows bearbeitet die Nachricht, dann mein Programm" bestätigt bzw. untermauert, kann ich jetzt mit meinem Wissen nicht behaupten.

Dankend

Stefan

21.07.2009 - 22:46 Uhr

Hi,

verstehe das ganze dann doch wohl noch nicht so ganz:

Mit den Hooks fange ich ja sozusagen ein paar WindowsMessages ab, oder nicht? Wenn ich jetzt in einer Funktion sage, dass ein Tastendruck schon als "erledigt" markiert ist, dann hat dies doch keinen Einfluss darauf, was andere Programme mit dem Event gemacht haben, bevor mein Programm das Event bekommen hat, oder nicht?

Nach meinem Ansatz könnte also Windows selbst die Nachricht "Windows-Taste gedrückt" erhalten haben und dann erst erhält mein PRogramm die Message und ab da an wird die Message an kein weiteres Programm geleitet.

In meiner HookCallback wird ja unter allen Umständen IntPtr.Zero zurück gegeben und nie CallNExtHookEx gestartet - somit dürfte ja bei allen Typen (WM_KEYDOWN, WM_KEYUP, usw.) dieses ausgeführt werden und es ist völlig egal, was ich in der if-Abfrage behandelt habe oder nicht.

Soweit die Sicht mit meinem aktuellen Sachverständnis.

Bis dahin

Stefan

21.07.2009 - 22:07 Uhr

Hi,

vielen Dank für deine Hilfe. Wenn ich dich richtig verstehe, dann soll die HookCallback-Funktion wie folgt angepasst werden, oder?

if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
            {
                int vkCode = Marshal.ReadInt32(lParam);
                Console.WriteLine((Keys)vkCode);
            }
            return IntPtr.Zero;

Allerdings wird beim Klick der Windows-Taste diese Aktion trotzdem ausgeführt; erkennbar am Öffnen des Startmenüs. Eine Erklärung dafür?

Bis dahin

Stefan

21.07.2009 - 20:47 Uhr

Hi,

vielen Dank für eure Hilfe. Damit konnte ich einiges anfangen und die gewünschten Anforderungen umsetzen.

Bis zum nächsten Problem

Dankend

Stefan

20.07.2009 - 19:25 Uhr

Hi Mentor49,

stecke gerade vor der gleichen Herausforderung und wollte fragen, ob du in der Thematik schon weiter gekommen bist. Habe mir gerade den Code von RemoteScreen angeschaut (Link aus der ersten Antwort) musste allerdings feststellen, dass hier ja jeweils der ganze Screen bei jedem Request übertrage wird, oder sehe ich das falsch?

Dies ist natürlich nicht wirklich effizeit und daher die Frage an dich, was du schon rausgefunden hast - vielleicht können wir uns dann ja gegenseitig etwas unter die Arme greifen 😃

Dankend

Stefan

19.07.2009 - 23:57 Uhr

Hallo,

ich möchte eine C-Sharp-Konsolenanwendung schreiben, die mir genau auflistet, was über die Tastatur eingegeben wird. Dies habe ich dank dieser Anleitung auch hinbekommen:

http://blogs.msdn.com/toub/archive/2006/05/03/589423.aspx

Jetzt hätte ich aber gerne folgende Auswertung drin:
wenn Windows-Taste gedrückt, dann diesen Tastendruck nicht ausführen; also eine Auswahl von Tasten einfach abfangen und dann unterdrücken.

Jemand von euch eine Idee, wie ich dies geschickt hinbekomme?

Dankend

Stefan

08.06.2009 - 20:56 Uhr

Hi,

vielen Dank - mit diesen Stichworten lässt sich einiges anfangen und haben mich auf die richtigen Weg gebracht. Mit richtigen/passenden Suchbegriffen in Google macht das Leben deutlich mehr Spaß!

Dankend

Stefan

07.06.2009 - 13:54 Uhr

Hallo,

habe folgendes Problem, für das ich leider keine Lösung finde...

Ich habe hier eine Schriftdatei (.ttf). Diese enthält eine Schrift, die ich in meinem Programm verwenden soll. Was ich bräuchte wäre folgendes:

Font font = new Font();
font.LoadFromFile(FileName);

Leider finde ich in diese Richtung nichts. Die Möglichkeit, die Datei in das Windows-Font-Verzeichnis zu laden, habe ich leider nicht.

Vielen Dank für eure Mithilfe

Stefan

11.05.2009 - 14:49 Uhr

Hallo,

ich verwende Visual Studio 2008 und dort habe ich in der Entwicklungsumgebung mehrere Panels angelegt. Alle haben die Option "Drag = Top" gesetzt bekommen. Somit ist also eine Art Liste von Panels entstanden. Ebenso sind alle (bis auf das oberste) mit der visibility=false gesetzt.

Im Code setze ich jetzt nach und nach (von oben nach unten) die Panels auf visible=true (bzw. .Show()). Leider ist dann die Anordnung der Panels nicht gleich der während der Entwicklungszeit.

Was mache ich falsch bzw. wie sage ich einem Panel, an welcher Position es zu stehen hat.

Vielen Dank für eure Mühen

Stefan

28.03.2009 - 17:54 Uhr

Hi,

eine Schande über meinen Beitrag - da hab ich irgendwie total komisch um die Ecke gedacht und die billigsten Sachen total übersehen. Danke das ihr mir noch Mal klar gemacht hab, wie dumm man manchmal sein kann.

Ihr habt absolut recht - keine Frage. War irgendwie - keine Ahnung - stand wohl was neben mir. Manchmal... 😃

Dankend und einen schönen Samstag

Stefan

28.03.2009 - 17:41 Uhr

Hi,

das mit i war nur ein Beispiel. Wir können dies tatsächlich so reduzieren:

Connection connectionGeneral = null; => so ist es definiert. connectionGeneral ist eine eigene (von mir entwickelte) Klasse. Wenn ich folgendes machen

Connection tmp = connectionGeneral;
tmp = new Connection();

dann ist tmp danach initialisiert (also != null), aber connectionGeneral ist immer noch null. Und wenn tmp nur eine Referenz auf connectionGeneral ist, dann müsste danach ja auch connectionGeneral != null sein, oder sehe ich das grad komplett falsch?

Dankend

Stefan

28.03.2009 - 15:18 Uhr

Hi,

habe folgenden groben Teil an Code:

public class Communication
{
    private Connection connectionGeneral;
    private Connection connectionMedia;
    
    public Communication()
    {
        Connection tmp;
        if (i == 0)
        {
            tmp = this.connectionGeneral;
        } else
        {
            tmp = this.connectionMedia;
        }
        
        connection.XY = "";
    }
}

Idee:
es gibt mehrere Instanzen einer Klasse - da einfach mehrere im Programm gebraucht werden. Anstatt jetzt an jeder Stelle zu prüfen (hier testweise mal mit i == 0), mit welcher Instanz gerade gearbeitet werden muss, wollte ich eine temporäre Referenz auf die "aktive Klasse" setzen. Sehe ich das richtig, dass wir hier von Referenzen sprechen - meine zumindest schon.

Wenn jetzt z.B. connectionGeneral die aktive wäre, und ich dann bei connection die Variable XY setze, dann sollte diese Veränderung direkten Einfluss auf connectionGeneral haben und nicht nur in der Instanz von connection.

Hoffe ich habe mich nicht zu unverständlich ausgedrückt und ihr wisst was ich möchte. Vielen Dank für eure Hilfe und ein schönes Wochenende - danke euch für jeden Tipp...

Stefan

07.02.2009 - 12:50 Uhr

Hi,

ein sehr wertvoller Tipp! Da steht Gott sei Dank wirklich *32 dahinter - das freut mich doch sehr. Habe das dem Support gleich mal mitgeteilt und jetzt bin ich mal sehr gespannt, was die drauf antworten.

Vielen Dank!

Stefan

07.02.2009 - 12:41 Uhr

Hi,

vielen Dank für deinen Beitrag - demnach scheine ich ja alles richtig gemacht zu haben freu. Da kann ich jetzt mit ruhigem Gewissen den Support erneut kontaktieren und fragen, wieso des net klappt.

Vielen lieben Dank

Stefan

07.02.2009 - 11:38 Uhr

Hallo,

ich habe ein Programm, welches ich unter VS2008, Vista SP1, x86 entwickelt habe. Dort läuft es reibunglos. Wollte es dann auf W2K3, SP2, x64 starten und dann rauchte es bei verschiedenen Proceduren ab.

Problem ist mittlerweile wie folgt eingegrenzt:
Es wird eine externe COM-Komponente aufgerufen. Jedes Mal wenn ich mir dort ein Objekt erzeuge, knallt es. Laut Hersteller der Komponente muss die Applikation im x86 Mode laufen. Zitat vom Hersteller:
The COM object is a 32 bit dll and must be run in 32bit mode. You need to click on the configuration manager in visual studio of you application and change it so that it's built for x86. This will force the app to 32bit mode and allow it to run on 64 bit systems.

Daher habe ich jetzt in die Projekteigenschaften geschaut, dann auf "Erstellen" geklickt und dort unter Zielplattform x86 eingetragen. Danach neu kompiliert, Daten auf das W2K3-System geladen => Fehler bleibt.

Muss ich noch irgendwo was anders machen, um der Applikation zu verklickern, dass diese im 32-bit-modus arbeiten soll?

Vielen Dank für eure Hilfe

Stefan

07.01.2009 - 09:39 Uhr

Hi,

vielen Dank für deinen Beitrag und sorry dafür, dass ich mich erst so spät melde - war die Tage noch ungeplant unterwegs. Sehr ausführlich - respekt! Damit ist mir auf jeden Fall mehr als geholfen und ich habe genügend Ansätze, das Problem anzugehen.

Vielen Dank dafür alles Gute für 2009!

Stefan

24.12.2008 - 22:40 Uhr

Hallo,

ich habe hier eine Komponete in einer DLL (test.dll) verpackt. Diese DLL gibt es als 32-Bit Version und eine als 64-Bit Version. Wenn ich in VS mit C# dann die test.dll integriert habe, kann ich auf meinem System auf damit arbeiten (32 Bit). Wenn ich dann aber auf ein 64-Bit System umgestiegen bin, habe ich die test.dll einfach durch die 64-Bit Version ersetzt und gut ist. Soweit so gut.

Allerdings soll das ganze Programm jetzt in einen Installer gepackt werden und hier haben wir nun das Problem, dass wir dort keine Unterscheidung zwischen 32-Bit und 64-Bit machen können. Daher sieht der Plan wie folgt aus:

  1. es wird immer test_32.dll und test_64.dll mitgeliefert und auch auf das Ziel-System mit Hilfe des Installers kopiert
  2. Die Applikation erkennt die Bit-Zahl des Systems und verweist dann dementsprechend auf die eine oder andere dll.

Punkt 1) ist überhaupt kein Problem allerdings weiß ich bei Punkt 2) überhaupt nicht, wo ich da ansetzen muss, weil bisher habe ich externe DLLs einfach in VS in den Verweisen hinzugefügt und zack fertig wars. Wie ich da allerdings jetzt so Verzweigungen rein mache - keine Ahnung - da bin ich auf eure Anregungen und Tipps angewiesen.

Vielen Dank für eure Mühen und euch allen ein paar nette Tage und einen guten Rutsch ins neue Jahr.

Stefan

24.11.2008 - 20:37 Uhr

Hallo,

habe einen C#-Server und einen C#-Client geschrieben (.NET 2.0), die über TCP kommunizieren. Der Server lauscht per TcpListener und der Client baut per TcpClient eine Verbindung auf (+SSL-Verschlüsselung). Das klappt auch sehr gut und zufriedenstellend.

Nun läuft der Server im Internet bei einem Provider und von mir aus komme ich da auch mit dem Client drauf. Nun kriegen auch einige Freunde/Bekannte das Tool und bei einem gibt es ein Verbindungsproblem.

Das Problem ist, der muss über einen Proxy (Squid) ins Internet und daher klappt die Verbindung nicht. Nun möchte ich den Proxy-Support auch einbauen und stehe dort vor dem Problem, ob dies überhaupt geht.

Im Wiki (http://de.wikipedia.org/wiki/Squid) habe ich gelesen, dass dieser nur http/https unterstützt. Bedeutet dies, dass andere Protokollarten (als somit auch meins) gar nicht darüber kommunizieren können?

Habe im Netz die folgende Komponente gefunden: http://safabyte.com/web/products/individualproducts/Proxy.aspx Dies würde ja bedeuten, dass auch diese für mich vollkommen uninteressant wäre, weil der Squid sowieso nur http/https unterstützt und ich somit überhaupt keine Chance habe, eine Verbindung zum Server aufzubauen.

Wie man sieht, bin ich was verwirrt. Kann mir jemand den rechten Weg weisen und mir weiter helfen? Oder ist mein Szenario einfach nicht möglich? Das würde mich allerdings tief schocken und dann stände ich vor einem gewaltigen Problem.

Dankend für eure Hilfe

Stefan

20.10.2008 - 19:54 Uhr

Hi,

danke für eure Tipps - werde mir diese jetzt zu Herzen nehmen und schauen, was sich machen lässt 🙂

Bis dahin

Stefan

19.10.2008 - 22:51 Uhr

Hallo,

ich habe eine kleine Komponente auf Basis eines UserControls geschrieben. Läuft soweit auch ganz gut, allerdings gibt es beim Scrollen noch ein kleines Problem:

Ich habe dem UserControl gesagt, dass AutoScroll = true; ist. Dies klappt auch wunderbar, wenn ich dann den dann rechts erscheinenden Scrollbalken benutze. Allerdings hat mein Maus auch noch ein nettes Scrollrad (was sonst wunderbar funktioniert). Wenn ich dieses drehe, passiert nix.

Daher die Frage:
Was ist zu tun, damit in diesem UserControl auch mein Mausrad erkannt wird? Hatte auf eine Funktion wie MouseOnMouseWheelMove gehofft, aber nix gefunden. Hab ich da irgendwas übersehen oder suche ich an der falschen Stelle?

Dankend

Stefan

01.10.2008 - 17:40 Uhr

Hi,

habe selbstverständlich schon nach "System.Security.Permissions.UIPermission" aber nur 5 Beiträge gefunden. Hieraus habe ich erfahren, dass man unter Projekt - Eigenschaften - Sicherheit die Option "voll vertrauenswürdig" auswählen soll. Wenn ich die aktiviere und dann aus VS heraus starte, dann kriege ich eine Warnmeldung und nach Klick auf OK läuft die Applikation auch.

Wenn ich allerdings die Applikatin dann über den Explorer starte, dann klappt es auch dann nicht? Bin ich etwa zu blöd zu suchen oder zu ungeschickt das Problem richtig anzugehen?

Dankend

Stefan

01.10.2008 - 17:10 Uhr

Hallo,

für unseren Kunden haben wir ein kleines Kommando-Zeilen-Tool geschrieben. Wenn dieses von einem lokalen Laufwerk gestartet wird, dann tut's auch das, was es soll. Jetzt startet der Kunde dies allerdings von einem Netzlaufwerk und dann knallt's. Ich kann's bei mir auch reproduzieren 😦

Wenn ich in VisualStudio einstelle, dass er es nach M:\test\ compilieren soll (M ist mein Netzlaufwerk zum Testen) und dann auf starten klicke, kriege ich folgende Fehlermeldung angezeigt:

Fehler bei der Anforderung des Berechtigungstyps System.Security.Permissions.UIPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.

Ich habe in der Main-Funktion in der ersten Zeile einen Breakpoint gemacht und da kommt der nicht mal hin - die Meldung wird schon vorher geschmissen. Irgendwie ralle ich nicht, wie ich vor der Main-Funktion debuggen soll geschweige denn wieso der bei einem Netzlaufwerk meckert...

Hat da von euch jemand einen Plan und kann mich aufklären? 🙂

Dankend

Stefan

24.09.2008 - 13:42 Uhr

Hi Leute,

nicht das ich genau wüsste, was der Code macht, aber er funktioniert. Habe ihn nach längerer Suche aus dem Netz zusammen kopiert und es klappt freu. Das Ergebnis will ich euch auch net vorenthalten:

PrivateFontCollection pfc = new PrivateFontCollection();
byte[] fontData = Properties.Resources.FontName;

IntPtr pbyt = Marshal.AllocCoTaskMem(fontData.Length);
Marshal.Copy(fontData, 0, pbyt, fontData.Length);
pfc.AddMemoryFont(pbyt, fontData.Length);
Marshal.FreeCoTaskMem(pbyt);

Font tmp = new Font(pfc.Families[0], 14, FontStyle.Bold);
e.Graphics.DrawString("Test-String", tmp, Brushes.Black, new PointF(0, 0));

Vielleicht hilft er ja mal jemandem weiter 🙂 Bis dahin

Stefan

24.09.2008 - 10:21 Uhr

Hallo,

ich möchte in meine Applikation einen privaten Font laden. Dafür habe ich bisher folgendes problemlos durchführen können:

PrivateFontCollection pfc = new PrivateFontCollection();
pfc.AddFontFile("FileName.ttf");
Font tmp = new Font(pfc.Families[0], 14, FontStyle.Bold);
e.Graphics.DrawString("Test-String", tmp, Brushes.Black, new PointF(0, 0));

Jetzt soll das ganze aber nicht über eine Datei auf dem Datenträger laufen sondern die Schrift soll als Resource der Applikation angehängt werden. Nun ralle ich aber nicht, wie ich diese Schrift in "pfc" geladen kriegen. Was ich bisher rausgefunden habe:

PrivateFontCollection pfc = new PrivateFontCollection();
byte[] fontData = Properties.Resources.MeineSchrift;

Ebenso gibt es dann die Funktion

pfc.AddMemoryFont(IntPtr Memory, int Length);

doch habe ich keinen Plan, wie ich von dem Byte-Array diese Werte kriege. Hat jemand von euch n' Plan, wie ich das in den Griff kriege?

Vielen Dank

Stefan

PS: Ich versuche zwanghaft die Möglichkeit zu umgehen, den Font erst ins Temp-Verzeichnis zu speichern und von dort zu laden. Es sollte schon "alles in der Applikation" bleiben.

24.09.2008 - 09:28 Uhr

Hi,

man kann tatsächlich keine otf Schrift-Dateien darfstellen. Naja - dafür gibt es halt Programme, die diese ins ttf-Format umwandeln können. Wenn's ein Mal konvertiert ist, dann läuft es blendend.

Dankend

Stefan

23.09.2008 - 20:05 Uhr

Hallo,

ich habe eine Schrift nach C:\Windows\Fonts kopiert. Dort wird sie auch als OpenType (dateiname.otf) angezeigt. Nun starte ich Office und schwupps kann ich die Schrift auch auswählen (Schriftname wird also in der entsprechenden ComboBox angezeigt).

So - jetzt möchte ich diese Schrift gerne auch verwenden. Gesagt getan:

Font temp = new Font("Schriftname", 14);
e.Graphics.DrawString("TEST", temp, Brushes.Aqua, new PointF(0, 0));

Es wird auch brav gezeichnet, aber nicht in der Font, die ich angegeben habe - sondern in Arial (oder so ähnlich). Habe ich mir gedacht, liste ich auch mal alle Schriften auf, die c# so erkennt:

InstalledFontCollection fontCol = new InstalledFontCollection();
FontFamily[] fontArr = fontCol.Families;

for (int i = 0; i < fontArr.Length; i++)
{
  textBox1.Text += fontArr[i].GetName(0) + " - ";
}

Leider taucht auch dort nicht die gewünschte Schrift auf und ich frage mich: Was mache ich falsch? Es muss doch irgendwie möglich sein, dass ich in dieser blöden Schrift zeichen kann 🙂

Dankend für eure Hilfe

Stefan