Hallo w1z4rd2003,
probier mal
req.Headers.Add("Cache-Control", String.Format("max-age={0}", TimeSpan.FromMinutes(3).TotalSeconds));
alternativ
req.Headers.Add("Cache-Control", "max-age=180");
siehe dazu auch www.w3.org
Grüße
"Activate" ist das Zauberwort ...
Ab und an auch bitte mal selbst :rtfm: benützen --> _Worksheet Interface
Leider hab ich teilweise immer noch dasselbe verhalten. In einem Workbook (z. B. C:\ExcelDatei1.xls) ist der Makroname "Makro1" definiert, in einem anderen Workbook (z. B. C:\ExcelDatei2.xls) nicht. Nun wird trotz ermittelten der Applikationsinstanz nicht immer das Makro in dem Workbook ausgeführt, in dem es definiert wurde. Kann ich leider nicht nachvollziehen 🤔
Wie ruffst du deinen Code auf?
Du verwendest .GetActiveObject um EINE aktive Excel-Instanz zu ermitteln. Das Problem ist hierbei, das NIE vorhersehbar ist welche der geöffneten Excel-Instanzen geschnappt wird. Ich weiß, war nur ein Beispiel 😉
Aus diesem Grund bin ich nach einer langen Suche darauf gekommen die ROT table durchzugehen. Dort findet man nämlich alle aktiven Workbooks aufgelistet. Hast ja Recht, ich bin dem aufgesessen, dass man damit die Applikation selbst bekommt. Mein Fehler 8)
xxxprod hat zum Teil Recht. Da du Late Binding verwenden möchtest hier mal als Wiedergutmachung nen bisschen Code 😁
object[] monikers = Win32.Win32.GetActiveObjectsFromROT("Mappe1.xls");
object oWorkbook = null, oApp = null;
try
{
oWorkbook = monikers[0];
oApp = oWorkbook.GetType().InvokeMember("Application",
BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public,
null, oWorkbook, null);
oApp.GetType().InvokeMember("Run",
BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance,
null, oApp, new object[] { "Makro1" });
}
finally
{
if (oApp != null) Marshal.ReleaseComObject(oApp);
if (oWorkbook != null) Marshal.ReleaseComObject(oWorkbook);
foreach (object o in monikers)
Marshal.ReleaseComObject(o);
}
Und noch mein Wrapper:
public class Win32
{
[DllImport("ole32.dll")]
public static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot);
[DllImport("ole32.dll")]
public static extern int CreateBindCtx(int reserved, out IBindCtx ppbc);
public static object[] GetActiveObjectsFromROT(string moniker)
{
ArrayList objs = new ArrayList();
IRunningObjectTable prot;
IEnumMoniker pMonkEnum;
GetRunningObjectTable(0, out prot);
prot.EnumRunning(out pMonkEnum);
pMonkEnum.Reset();
IntPtr fetched = IntPtr.Zero;
IMoniker[] pmon = new IMoniker[1];
while (pMonkEnum.Next(1, pmon, fetched) == 0)
{
IBindCtx pCtx;
CreateBindCtx(0, out pCtx);
string str;
pmon[0].GetDisplayName(pCtx, null, out str);
if (str.Contains(moniker))
{
object objReturnObject;
prot.GetObject(pmon[0], out objReturnObject);
objs.Add(objReturnObject);
}
}
return objs.ToArray();
}
}
Hier nun aber auch gleich wieder der Hinweis: :rtfm:
Nur mal so zum Verständnis:
object XL = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
Liefert dir ein Object (genauer einen RCW) für die Excel-Anwendung.
Für das Makro musst du natürlich auch den Namen übergeben ...
Bei mir läuft folgender Code ohne Probleme:
object oApp = Marshal.GetActiveObject("Excel.Application");
oApp.GetType().InvokeMember("Run", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null,
oApp, new object[] { "Makro1" });
Hallo JessicaLampe,
willkommen hier im Forum 👍 (Obligatorischer Hinweis: [Hinweis] Wie poste ich richtig?)
Mit dem Code aus
Hallo @all,
Code:
>
bekommst du doch schon die passende Excel-Instanz für ein Workbook ...
Jetzt noch 'Run' aufrufen und es sollte funktionieren 😁
Nun habe ich das folgende Problem, das Makro lässt sich nur aufrufen, wenn ich die dazugehörige Excel-Instanz (application instance) übergebe. Ich hab aber nur Zugriff auf die untergeordneten Workbooks. Versteh ich nicht 🤔
Ein bisschen Beispielcode aus deiner Anwendung wäre übrigens nicht schlecht.
Grüße
:rtfm:
Returns a Range object that represents all the columns on the specified worksheet. Range.Item Property
RowIndex++**Required**++ Object. The index number of the cell you want to access, in order from left to right, then down. Range.Item(1) returns the upper-left cell in the range; Range.Item(2) returns the cell immediately to the right of the upper-left cell.
Allerdings bin ich nicht der OP Ups 8)
Hallo ujr,
da es bei mit funktioniert tipp ich mal darauf, das deine Ini-Datei mit ner eigenartigen Codepage gespeichert wurde.
Keine Ahnung ob dir das weiter hilft oder du das schon probiert hast ... öffne die Datei einfach mal im Visual Studio und stell unter Datei --> Erweiterte Speicheroptionen mal was mit Unicode oder Westeuropäisch (Windows) ein.
Grüße
edit: Ich geh mal davon aus du nutzt
[DllImport("KERNEL32.DLL", EntryPoint="GetPrivateProfileStringA", CharSet=CharSet.Ansi)]
private static extern int GetPrivateProfileString (/*[...]*/);
aus dem Codesnippet von mentalis.org.
Versuchs einfach mal mit:
[DllImport("KERNEL32.DLL")]
private static extern int GetPrivateProfileString (/*[...]*/);
Hallo doudi,
aus deiner Beschreibund deute ich jetzt mal, dass du die GUI in einem Projekt entwickelt hast, welches als DLL kompiliert werden soll.
Debuggen kann man allerdings nur ausführbare Programme (und dazu gehört eine DLL leider nicht).
Grüße
BTW: Falsches Forum
Wenn ich richtig gesehen hab is das, was du suchst
Microsoft.Office.Interop.Word.Range.ParagraphFormat.Style
und
Microsoft.Office.Interop.Word.WdBuiltinStyle.wdStyleHeading1;
Grüße
Wenn UltraVNC einmal als Service registriert wurde all you need is: ServiceController.
ServiceController svrCtrl = new ServiceController("VNC Server");
Console.WriteLine(svrCtrl.DisplayName + " is " + Enum.GetName(typeof(ServiceControllerStatus), svrCtrl.Status));
switch (svrCtrl.Status)
{
case ServiceControllerStatus.PausePending:
svrCtrl.WaitForStatus(ServiceControllerStatus.Paused);
break;
case ServiceControllerStatus.StopPending:
svrCtrl.WaitForStatus(ServiceControllerStatus.Stopped);
break;
case ServiceControllerStatus.StartPending:
case ServiceControllerStatus.ContinuePending:
svrCtrl.WaitForStatus(ServiceControllerStatus.Running);
break;
}
switch (svrCtrl.Status)
{
case ServiceControllerStatus.Paused:
svrCtrl.Continue();
svrCtrl.WaitForStatus(ServiceControllerStatus.Running);
break;
case ServiceControllerStatus.Stopped:
svrCtrl.Start();
svrCtrl.WaitForStatus(ServiceControllerStatus.Running);
break;
case ServiceControllerStatus.Running:
svrCtrl.Stop();
svrCtrl.WaitForStatus(ServiceControllerStatus.Stopped);
break;
}
Console.WriteLine(svrCtrl.DisplayName + " is " + Enum.GetName(typeof(ServiceControllerStatus), svrCtrl.Status));
Hallo tmarbi,
um noch mehr Verwirrung zu stiften, geb ich auch noch meinen Senf dazu.
du müsstest dich fragen, woher das Fragmentieren kommt Die Fragmentierung verursacht die Speicherverwaltung. Der Heap, welcher vom Garbage Collector verwaltet wird, unterteilt sich in Small Object Heap und Large Object Heap. Objekte die mehr als 85.000 bytes groß sind, werden auf dem Large Objekt Heap abgelegt. Dieser wird jedoch vom Garbage Collector, im Gegensatz zum Small Object Heap, nicht Defragmentiert, weil das Kopieren der Objekte und das Aktualisieren der Referenzen zu viel Zeit in Anspruch nehmen würde.
[Quelle: dotnetpro, 7/2007, Die Garbage Collection des .NET Frameworks]
Bsp:
class A
{
byte[] buffer = new byte[100000];
}
Objekte der Klasse A landen auf dem Small Objekt Heap. Der buffer jedoch auf dem Large Objekt Heap.
ob du selber dafür verantwortlich bist und es somit auch vermeiden könntest. IMHO also klar NEIN.
Wenn das nicht zum Ziel führt, könntest du die Größe des virtuellen Speichers erhöhen. Das sollte außer einem größeren pagefile auf der Platte keine negativen Auswirkungen haben. Dies führt dich auch nicht weiter, da der verfügbare Prozessspeicher (der virtuelle Prozessraum) durch das Betriebssystem begrenzt wird. Ich geh mal davon aus, du nutzt WinXP, und dort sind es (in der 32bit-Version) stanardmäßig je Prozess 2GB. Mithilfe des /3GB Schalters in den 'Bootoptionen' kann man den Prozessspeicher allerdings auf 3GB erweitern.
Siehe dazu auch:
Prozesse beim Betriebssystem Windows
BigArray<T>, getting around the 2GB array size limit
Grüße
él toro
Hallo wazer317,
nicht der catch-Block muss was zurückgeben, sondern deine Funktion.
ich dachte try/catch funktioniert losgelöst von allen Vorgaben des Codes den es umgibt Deine Funktion wird aber auch von Code umgeben und dieser erwartet einen Rückgabewert.
Frage 2: Etwas zurückgeben. Selbst null ist da hilfreich.
Ich mach das meistens so:
public ArrayList ParameterArrayList()
{
//ArrayList erzeugen
ArrayList al = new ArrayList();
try
{
//ArrayList mit Werten füllen
al.Add(Wert1);
al.Add(Wert2);
}
catch (Exception ex)
{
AllgemeineErrrorBehandlung(ex);
}
//ArrayList zurückgeben
return al;
}
Grüße
Exception wegfangen aber nicht ansehen 8)
System.Runtime.Serialization.SerializationException wurde nicht behandelt.
Message="Der Typ System.Windows.Forms.ImageList in Assembly System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ist nicht als serialisierbar gekennzeichnet."
Eine ImageList ist IMHO nicht serialisierbar sondern nur die Images. Stickwort: ISerializable
Hallo Vinx,
irgendwie versteh ich dein Problem nicht.
Diese 30 Methoden möchte ich ungern mit in die Logik mitschleifen. Was verstehst du unter mitschleifen?
class Test
{
private Service service;
public Test()
{
service = new Service());
}
public void TestMe()
{
int number = 0;
service.GetValue(ref number);
Console.WriteLine(number);
bool flag = false;
Service.GetValue(ref flag);
Console.WriteLine(flag);
}
}
Sollte problemlos funktionieren.
Wenn du trotzdem eine generische Methode willst probier:
public T Get<T>()
{
T result = default(T);
object[] args = new object[] { result };
//ParameterModifier[] modifiers = new ParameterModifier[] { new ParameterModifier(1) };
//modifiers[0][0] = true;
service.GetType().InvokeMember("GetValue", BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, null, service, args, /*modifiers*/ null, null, null);
return (T)args[0];
}
Hallo Pegasus2003,
möchtest du einen Rahmen um die Zellen zeichnen (Microsoft.Office.Interop.Excel.Range.Borders[XlBordersIndex]) oder diese nur markieren?
BTW: In welchem Typ soll bitte 'Draw Borders' verfügbar sein?
cellRange = tmpCurrentWorksheet.get_Range("A3", "A3");
ist gleichbedeutend mit
cellRange = tmpCurrentWorksheet.get_Range("A3", Type.Missing);
Nix, ich hab nur fehlendes ergänzt/korrigiert, darum 😁 8)
string[] nul = Directory.GetDirectories(@"C:\");
DirectoryInfo[] nul = Directory.GetDirectories(@"C:\");
Selbe Methode, unterschiedlicher Returntype?
Directory.GetDirectories
Liefert IMHO nur string[] ...
Mein Vorschlag 😁
string[] directories = Directory.GetDirectories(@"C:\");
foreach (string directory in directories)
{
lstTags.Items.Add(Path.GetDirectoryName (directory));
}
Hallo BeZi,
⚠[Hinweis] Wie poste ich richtig?Punkt 5 ⚠
Protect & Unprotect sind keine Setter, sondern Methoden, also statt
BindingFlags.SetProperty
BindingFlags.InvokeMethod
verwenden.
Wenn du Late-Binding benutzt, musst du keine Argumente übergeben. Nicht mal Type.Missing.
objSheets.getType().InvokeMember("Unprotect", BindingFlags.InvokeMethod, null, obSsheets, null);
sollte funktionnieren. Das gleich gilt für Protect!
Grüße
él toro
Hallo Kleiner Progger,
und willkommen hier im Forum.
Der obligatorische Hinweis: [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen)
Ein Objektverweis ist für das nicht statische Feld, Methode oder Eigenschaft von "Save.Form1.Pfad" erforderlich. Sagt eigentlich alles aus!
Du kannst nicht aus einer statischen Methode auf eine Membervaiable eines Objektes zugreifen.
Grüße
él toro
Bau erstmal ein paar Consolenausgaben ein. Ansonsten wüsst ich jetzt erstmal nicht weiter 🙁
Keine Exception, keine Fehler, keine Einträge im Ereignisprotokoll?
Was machtn Right(...) und wie sieht deine ini aus?
ServiceStartMode wird vom ServiceInstaller verwendet, [...]
Die ServiceInstaller-Eigenschaftenwerte können nach der Installation nicht mehr geändert werden. Um den StartType zu ändern, muss entweder der Dienst deinstalliert und anschließend neu installiert werden, oder es müssen die Einstellungen manuell mithilfe des Dienststeuerungs-Managers geändert werden.
Evtl. wäre es noch möglich den Wert über die Registry zu ändern ...
Hallo getle87,
eins Vorweg: Ich hab von GPS nicht wirklich Ahnung X(
GPSPort.ReadExisting()
nicht null sondern string[0] zurück?
String.IsNullOrEmpty()
könnte dir hilfreich sein 😁
Du bewegst dich tatsächlich so schnell 8)
Ist distance manchmal NaN?
Da der Port puffert müsstest du auch puffern und jeweils beim '$' trennen.
Das Projekt ist sicher interessant.
Zum nachvollziehen deiner Berechnungen wären ein paar Beispieldaten interessant, evtl. als CSV, dann kann man den Kram gleich mal einlesen ...
[Hinweis] Wie poste ich richtig?Punkt 1.2
Hast Recht, hab deinen Code wohl zu schnell überflogen 😉
Ich hab deinen Code mal Debugged und des Rätsels Lösung (siehe Bild) ...
Müsste dir eigentlich beim Debuggen aufgefallen sein ?(
Hallo getle87,
das Problem ist deine Abbruchbedingung in der while-Schleife von createarray.
Beim Debuggen müsste dir aufgefallen sein, dass bei counter == 5 nur 4 Zeichen kopiert worden sind.
Ich würd dir für derartiges immer for-Schleifen empfehlen 😉
Grüße
él toro
Eigentlich heißt es "Never touch a running system." 8)
Hallo waikiki22,
Original von waikiki22
Ich habe den Fehler schon so weit eingegrenzt, dass ich sagen kann,
innerhalb der Funktion AverageImages liefert sInputfile.CanRead "true",
innerhalb der Funktion DoAverage "false"Wie kann ich das Problem lösen, ohne beide Funktionen in eine zusammenzuschreiben zu müssen?? Mit ein bisschen mehr Quellcode als den Signaturen lässt sich das sicher klären 😉
Grüße
[Hinweis] Wie poste ich richtig?
Code ?(
TextBox.SelectionStart = TextBox.Text.Length;
TextBox.ScrollToCaret();
?(
Hallo brev,
im Normalfall speichert Excel ein bearbeitetes Dokument bei 'Save()' ohne Nachfrage.
Es sei denn dein Dokument ist eine Vorlage ... dann musst du natürlich einen Namen angeben.
Hallo kiar,
mein Lösungsansatz wäre:
public static DateTime GetMonday(int week, int year)
{
// die 1. KW ist die mit mindestens 4 Tagen im Januar des nächsten Jahres
DateTime dt = new DateTime(year, 1, 4);
// Beginn auf Montag setzten
dt = dt.AddDays(-(int)((dt.DayOfWeek != DayOfWeek.Sunday) ? dt.DayOfWeek - 1 : DayOfWeek.Saturday));
// Wochen dazu addieren
return dt.AddDays(--week * 7);
}
Grüße él toro
Hallo Philzstift,
dass du cs.Close() weglässt kann aber nicht die Lösung sein 🤔
Ich bin der Meinung, du hast den Algorithmus nicht vollständig Configuriert bzw. beachtest dessen Verhalten nicht ausreichend ...
Ich lass mich auch gern eines besseren belehren.
Bei mir kommt beim Close jedenfalls ne CryptographicException. Diese wird verursacht durch den übergebenen, zu verschlüsselnden Block deren Länge nicht mit der Blockgröße des Algorithmus übereinstimmt (Standard == 128 ). Außerdem füllst du den Block nicht mit den entsprechenden Füllzeichen (Standard == PCKS7) auf, wodurch der Algorithmus nicht richtig arbeiten kann.
Außerdem würd ich dir für Stream using ans Herz legen, dann vergisst du auch kein Close, Dispose oder Flush mehr 😉
Bei mir läuft folgendes ohne Probleme durch:
public static void Decrypt(string fileIn, string fileOut, string Password)
{
using (FileStream fsIn = new FileStream(fileIn, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (FileStream fsOut = new FileStream(fileOut, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite))
{
PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76});
Rijndael alg = Rijndael.Create();
alg.Key = pdb.GetBytes(32);
alg.IV = pdb.GetBytes(16);
alg.Padding = PaddingMode.Zeros; // Standard ist PKCS7
using (CryptoStream cs = new CryptoStream(fsOut, alg.CreateDecryptor(), CryptoStreamMode.Write))
{
byte[] buffer = new byte[alg.BlockSize];
int bytesRead = 0;
do
{
bytesRead = fsIn.Read(buffer, 0, buffer.Length);
//
// Block mit 0 füllen
//
if (bytesRead < buffer.Length)
{
for (int i = bytesRead; i < buffer.Length; i++)
buffer[i] = 0;
}
if (bytesRead > 0)
cs.Write(buffer, 0, buffer.Length);
} while (bytesRead > 0);
}
}
}
}
Grüße él toro.
Hallo 2Good4You,
aber das funkioniert nicht, der Befehl wird nicht erkannt! Wie poste ich richtig?
DateTime lastWrite = new System.IO.FileInfo(string filePath).LastWriteTime;
?(
@Killerhase:
<klugscheiss>
Original von Killerhase
Initialisier die Variable global also:Thread ThreadNeu_Import_VA = null;
Genau genommen ist das die Deklaration und die Initialisierung des Wertes der Variable mit 'null' in einem.
Original von Killerhase
und vor deiner Schleife oder bei deiner OnLoad oder wie auch (Konstruktor deiner Form bzw. Klasse) immer deklarierst du den Thread mit:ThreadNeu_Import_VA = new Thread(new ThreadStart(Neu_Import_VA));
Ist nun eigentlich nur ne neue Wertzuweisung!
Original von Killerhase
Darum erst initialisieren und später deklarieren.
Genau genommen isses andersrum 😁
</klugscheiß>
Aber wir wollen ja nicht Klugscheißen 8)
Ansonsten sollte es aber so funktionieren 👍
cmd /c <kommando>
also evtl. so
Process.Start("cmd /c", "net use T: /DELETE");
?(
edit: Scheint nicht zu funktionieren, da er eine ausführbare Datei erwartet.
Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.System) + @"\cmd.exe", " /k net use T: /DELETE");
sollte funktionierten.
'/c' gehört ja zu den Parametern ... 8o
:rtfm: 🛈
File.Copy(string Quellpfad, string Zielpfad, bool replace);
Original von RonnyW
ehrlich gesagt hab ich das aus einem example von microsoft zu DirectSound und da steht das genau so drin, funzt bei denen komischer weise auch, nur bei mir nicht... example (engl.) == Beispiel (deutsch) 8)
Den Link, wo ich das nachlesen kann 😉
Genau.
Hast du einen Link zum Beispiel?
Hallo RonnyW,
[Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen)
Du startest den Thread, bevor du dein NotificationEvent initalisiert hast ...
NotificationEvent = new AutoResetEvent(false);
// ...
NotifyThread.Start();
sollte Abhilfe schaffen ...
Einfach dort, wo du in die Textbox schreibst nen Zeilenumbruch einfügen 👍
Und das werden wir auch weiter machen da wir Anfängern gegenüber offen sind, aber du musst schon ein bisschen mehr Eigeninitiative an den Tag legen. Schließlich hätten dich aus meiner Sicht die vorhergehenden Antworten der Lösung schon näher bringen müssen ...
BTW: Hat dir der Codeschnipsel geholfen?
Hallo habeKA,
der Name ist Programm 8)
using(StreamReader sr = new StreamReader(ofd.FileName))
{
while (!sr.EndOfFile)
{
txtDatei.Text += sr.ReadLine().Substring(9);
}
}
BTW: TextBox.Multiline = true nicht vergessen
Hallo Pegasus2003,
im allgemeinen erstmal das benutzen, dann folgendes lesen:
[Artikel] Resourcen in .NET Assemblies
Lokalisierung von Komponenten
und dann:
Speicher dir das ByteArray aus den Resourcen in eine temporäre Datei, bearbeite diese, Speicher das Excelfile normal mit SaveAs und lösche die temporäre Datei wieder.
Etwa so:
string tmpFilename = System.IO.Path.GetTempFileName();
System.IO.File.WriteAllBytes(tmpFileName, Resources.ExcelTemplate);
Excel.Application app = new Excel.Application();
app.Workbooks.Open(tmpFileName, /* ... */);
// ...
app.ActiveWorkbook.SaveAs(newFileName, /* ... */);
Grüße
Hallo peterchen72,
Noch einfacher:
Du kopierst den Chart als Bild in das Clipboard und erzeugst in deinem Programm nen Image draus ...
Stickwort: CopyPicture