|
Did you read my previous replies ?
Try this:
navigate explorer to the bin/debug folder of your C# program
Start CMD
do "dir" to make sure your exe is there
set TEST=ABC
nameOfMyCSharpProgram.exe
|
|
|
|
|
Hi Luc,
either I don't understand your replies, or you didn't understand my problem.
The programs which use the environment variables which I want to get are not my programs. So I don't know which environment variables they use. So I can't set this in a DOS-Box.
Another example:
You write a program. This program do nothing when it starts.
You write a methode which create a new environment variable, if a button is pushed. This environment variable is only guilty in your program, process, session.
Now you start your program but you don't push the button.
I start than the process explorer on the same maschine and search for your program/process.
The process explorer shows me all the environment variable which your program use.
I think these are the one, which stand in the user and system environment.
Then I start my special program.
This program should do the same as the process explorer.
My program shows me the same environmment variables which your program use.
Then you push the button. Your methode create a new environment variable.
I refresh the view of the process explorer. The process explorer shows me now one environment variable more. It shows me your new created variable.
I refresh the view of my program, but my program don't show me the new environment variable. Why?
I think that the dotnet framework cannot show me the variable, too.
I think I need a winapi-function.
For example to get the parent id of a process I used the createtoolhelp32snapshot-function. So I think I need a winapi function too.
Or did I do a mistake ?
My code snippet is the following.
private void button1_Click(object sender, EventArgs e)
{
listView1.View = View.Details;
listView1.Sorting = SortOrder.Ascending;
listView1.FullRowSelect = true;
listView1.Columns.Add("Name", 150, HorizontalAlignment.Left);
listView1.Columns.Add("Wert", 450, HorizontalAlignment.Left);
ListViewItem oItem;
listView1.Items.Clear();
Process[] localByName = Process.GetProcessesByName(textBox1.Text);
if (localByName.Length > 0)
{
Process oProcess = localByName[0];
foreach (DictionaryEntry de in _
oProcess.StartInfo.EnvironmentVariables)
{
oItem = listView1.Items.Add(de.Key.ToString());
oItem.SubItems.Add(de.Value.ToString());
}
}
}
To use the snippet you need on the form a listView, a pushbutton and a textbox-object.
If I haven't make an error in my code, do you have a code snippet who can read the environment variable, which is created in your example program ?
Thanks
Stephan
|
|
|
|
|
Hi again,
SteveA69 wrote: I refresh the view of the process explorer. The process explorer shows me now one environment variable more. It shows me your new created variable
AFAIK that is completely impossible; and I told you so days ago. No need to go on about this.
For every single process the outside world can only see the envvars that were in effect
when that process got started, everything else is hidden inside the process.
The "Process Explorer" you mentioned before does not do that either, probably for a good
reason: it cant be done.
|
|
|
|
|
Hi Luc,
I see you cannot help me in this case.
Thanks for your help and your answers.
Stephan
|
|
|
|
|
I am aware how to do it alphabetically (ascending/descending) but I am unfamiliar if its capable to do the same with numbers and such.
public static void DoSomething()
{
DoSomethingElse();
}
public static void DoSomethingElse()
{
Dosomething();
}
|
|
|
|
|
You'll likely want to write a custom IComparer for that. Then set the ListView s ListViewItemSorter property to an instance of your comparer. You do mean sort list items by column, not sort columns, right?
|
|
|
|
|
I will give it a try, thanks. Yes, that's what I meant.
public static void DoSomething()
{
DoSomethingElse();
}
public static void DoSomethingElse()
{
Dosomething();
}
|
|
|
|
|
Hello everyone,
I am thinking of using Backgroundworker to transfer data from a remote database into my Windows Apllication. In past I have worked with Backgroundworker to run some mathematical process. But in those case I always knew about the completion of the mathematical process and could check to see if it has been reached.
I am wondering how I would know the process in Data Transfer from a remote database has been completed?! Otherwise, how I am going to stop the backgroundworker?
Any ways, I was wondering if someone can guid me on this issue.
Thank you very much and have a great day.
Khoramdin
|
|
|
|
|
Khoramdin wrote: But in those case I always knew about the completion of the mathematical process
How did you know that the process has completed?
Khoramdin wrote: Otherwise, how I am going to stop the backgroundworker?
Like this:
private void backgroundWorker1_RunWorkerCompleted(
object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
}
else if (e.Cancelled)
{
resultLabel.Text = "Canceled";
}
else
{
resultLabel.Text = e.Result.ToString();
}
}
Look at this link to get details about BackGroundWorker.
http://msdn2.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx[^]
|
|
|
|
|
hello.
i am working on an irc client and now i've got two problems. i hope someone can help me ;D
i use asynchronous sockets.
1) the byte array i fill, is sooner or later filled completely. but i don't know how to clear the array and when i have to clear it, or do i even have to clear it? as soon as the array is full, the program throws - of course - an exception ("ArgumentOutOfRangeException").
2) sometimes i get the same input more than one time. for example: when i join a channel and save the nicknames to the nicklist, some nicknames appear twice or even more often. what do i have to do that this doesnt happen?
the code:
private byte[] data = new byte[4096];
public void InitSocket()
{
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Blocking = false;
IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("194.124.229.58"), 6667);
client.BeginConnect(ipe, new AsyncCallback(OnConnect), client);
}
public void OnConnect(IAsyncResult ar)
{
Socket remote = (Socket)ar.AsyncState;
remote.EndConnect(ar);
remote.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(OnReceive), remote);
}
public void OnReceive(IAsyncResult ar)
{
Socket remote = (Socket)ar.AsyncState;
int received = remote.EndReceive(ar);
if (received == 0)
{
client.Close();
return;
}
string receivedtext = Encoding.Default.GetString(data, 0, received);
sw.Invoke(Addmsg, new string[] { receivedtext });
remote.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(OnReceive), remote);
}
if you have improvements on my code, please tell me ;D
kind regards
|
|
|
|
|
donjubs wrote: ) the byte array i fill, is sooner or later filled completely. but i don't know how to clear the array and when i have to clear it, or do i even have to clear it? as soon as the array is full, the program throws - of course - an exception ("ArgumentOutOfRangeException").
If you're re-using the array, you'll need to clear it or just re-create it. (To "clear" it, just set all its elements to 0, that's like resetting it, putting it back into it's created state). But the exception you're getting indicates you're trying to write more than 4096 bytes (e.g. data.Length) to the array. From the code you posted, I don't see that happening anywhere, which means there is probably some other code that tries to write beyond the end of the data array. On what piece of code is the exception occurring?
donjubs wrote: 2) sometimes i get the same input more than one time. for example: when i join a channel and save the nicknames to the nicklist, some nicknames appear twice or even more often. what do i have to do that this doesnt happen?
If you want only distinct names in your list, just do a check on the list for the name before adding it:
List<string> nicknames = new List<string>();
...
string newNick = "Johnny Sasaki";
if(!nicknames.Contains(newNick))
{
nicknames.Add(newNick);
}
|
|
|
|
|
1) the line is marked. see the comment in the OnReceive method. there is no other code (except for the OnSend method - but i don't thinkt that this one is the problem, cause it isn't used when the exception is thrown) that uses the array!
2) it was just an example. it may also happen with joins, quits etc. there has to be a way how to avoid that!?
|
|
|
|
|
1) What's sw? What's Addmsg?
2) Well, if you're using multiple threads to add and remove to the list of nicknames, you need a thread-safe structure or use a lock before reading and writing to the list. Have you considered looking at System.Collections.Generic.Dictionary<K, V>? It allows only unique keys. It will throw exceptions if you try to add duplicates. Like with any other structure, if you're using multiple threads to read and write to it, you'll need to do some locking to do this in a thread-safe way.
|
|
|
|
|
1) sw = form object
addmsg = delegate
guess there isn't the prob
2) yes, i've thought about it, but i don't get it working ;D well, guess i just have to try..
|
|
|
|
|
1) I bet the problem is in the Addmsg function. Can you post the code for that?
|
|
|
|
|
there is no function for that!
private delegate void Addmsgs(string msg);
private event Addmsgs Addmsg;
Addmsg = new Addmsgs(IRCStream);
IRCStream is a method, but it doesn't have anything to do with the array ;D
private void IRCStream(string line)
{
.
.
}
|
|
|
|
|
Yes, I meant the function that the Addmsg delegate is pointing to.
The exception may have been due to your passing a string[] to the Invoke method, which tries to call IRCStream(string), which doesn't take a string array (it only takes a string).
By the way, what does the exception message say? And what does the exception stack trace look like?
|
|
|
|
|
exception message: "ArgumentOutOfRangeException: InvalidArgument=Value of -1 is not valid for index"
exception line: "sw.Invoke(Addmsg, receivedtext);"
receivedtext is correct, when the error occurs, so the problem is probably the delegate.
<br />
private delegate void Addmsgs(string msg);<br />
private event Addmsgs Addmsg;<br />
<br />
Addmsg = new Addmsgs(IRCStream);
perhaps the problem is, as you mentioned some posts ago , that the socket is not thread safe. I googled and tried to find a solution to make the socket thread safe, but i didn't find anything, that could help me.
thanks for helping me so far
|
|
|
|
|
All that looks OK. It's a little round-about way of doing it (in C# 2 you can do anonymous methods that would save you the trouble of creating the delegate), but it should work nonetheless.
As a diagnostic, try commenting out the code in the IRCStream method. Does it still error out?
Also, is there an InnerException part of the error that occurs? If so, what is the stack trace on the InnerException of your ArgumentOutOfRangeException?
|
|
|
|
|
i found the error ;D indeed it was a mistake in the method. i just forgot an if stupid mistake.
but there's still another problem. if i join a big channel and there are a lot of messages coming in, in a short period of time, then it seems that i don't get all messages, but therefore some twice! i guess the solution would be to make the socket thread safe. how do i make the socket thread safe? as already mentioned, i don't find anything on the net that could help me. i hope you can help me with that too ;D
thanks so far!
|
|
|
|
|
I'm not sure that threading is really the problem. However, i If threading is indeed the problem, you can try putting a lock around your receiving code:
private byte[] data = new byte[4096];
private readonly object synchronizer = new object();
public void InitSocket()
{
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Blocking = false;
IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("194.124.229.58"), 6667);
client.BeginConnect(ipe, new AsyncCallback(OnConnect), client);
}
public void OnConnect(IAsyncResult ar)
{
Socket remote = (Socket)ar.AsyncState;
remote.EndConnect(ar);
remote.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(OnReceive), remote);
}
public void OnReceive(IAsyncResult ar)
{
lock(synchronizer)
{
Socket remote = (Socket)ar.AsyncState;
int received = remote.EndReceive(ar);
if (received == 0)
{
client.Close();
return;
}
string receivedtext = Encoding.Default.GetString(data, 0, received);
sw.BeginInvoke(Addmsg, new string[] { receivedtext });
remote.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(OnReceive), remote);
}
}
Now, some recommendations. First, I don't recommend using sw.Invoke or sw.BeginInvoke; use a System.ComponentModel.BackgroundWorker instead: it does all the "putting things on the right thread" for you using events for the "background work" (like your socket receiving), another event for progress changed (like your received text bit) and also an event for when the background work is finished.. Search the articles on this site for examples.
Another recommendation is, are you sure you need to code up this by yourself? Why not use a free, open source library someone's already written, such as SmartIrc4Net[^].
|
|
|
|
|
donjubs wrote: sw.Invoke(Addmsg, new string[] { receivedtext }); // exception when data is full
This line looks completely wrong to me. You've already allocated a new string in the line above, why do you need to create an array of strings to be passed up to the display and put the new string in it?
The exception with your code is in the form code. Probably something to do with where you are displaying the string. Do you remove the lines from the top of the display window? What type of a control are you using?
Oh, there are many other questions to ask, but the only other one I will ask is: Where is the error handling for these methods?
Phil
|
|
|
|
|
well, i changed it to "sw.Invoke(Addmsg, receivedtext);" seems to improve it a little, but doesn't solve the problems.
i have to use invoke to display the messages in a richtextbox and invoke requires a delegate => Addmsg. so i don't think that there's still a mistake in it.
form code (i think that you mean that one):
<br />
private void IRCStream(string line)<br />
{<br />
string[] msgs = line.Split('\r');<br />
foreach (string msg in msgs)<br />
{<br />
sw.RTBOX.Text += msg;
}<br />
}<br />
so i don't think that there's the problem.
kind regards
|
|
|
|
|
Hi All,
I have a form with two panels in one i have a treeview and in another a listview , when i click on a treeview node it's selected but when i click on list view it's not selected.
Now , i want to change the background color of the selected node and want it to remain until i select another node.
If anyone has any idea , i will be thankful.
Praveen Sharma
|
|
|
|
|
Have you considered setting treeview.HideSelection to false?
|
|
|
|
|