|
The requirement is to pass the data as a memory stream between two different C# applications.
This is the code to send stream. But it doesn't really work.
using (MemoryStream ms = GetMemoryStream())
{
int hWnd = FindWindow(null, "Receive");
int dataSize = Convert.ToInt32(ms.Length);
COPYDATASTRUCT cds;
cds.dwData = 0;
cds.lpData = Marshal.AllocCoTaskMem(dataSize);
cds.cbData = dataSize;
SendMessage(hWnd, WM_COPYDATA, 0, ref cds);
Marshal.FreeCoTaskMem(cds.lpData);
}
modified 17-Jul-16 20:18pm.
|
|
|
|
|
You will have to be more specific than "it doesn't really work". That tells us nothing useful about what issues you are seeing. What happens if you debug the application? Does it find the window? Is your structure created properly? Why do you have to use such a cumbersome method for passing data? A simple TCP connection would be enough.
This space for rent
|
|
|
|
|
Well, the requirement is memory stream. That is, the Receiving application has to get the data as a memory stream.
I get an error is at
int dataSize = Convert.ToInt32(ms.Length);
and the error is "Cannot access a closed Stream."
modified 18-Jul-16 19:17pm.
|
|
|
|
|
This did work!
MemoryStream ms = new MemoryStream();
using (ms = GetMemoryStream())
{
ms = new MemoryStream(ms.ToArray());
COPYDATASTRUCT cds;
cds.dwData = 0;
cds.lpData = IntPtr.Zero;
cds.cbData = 0;
try
{
ms.Flush();
ms.Position = 0;
int hWnd = FindWindow(null, "Receive");
int dataSize = Convert.ToInt32(ms.Length);
cds.dwData = 0;
cds.lpData = Marshal.AllocCoTaskMem(dataSize);
cds.cbData = dataSize;
SendMessage(hWnd, WM_COPYDATA, 0, ref cds);
}
finally
{
Marshal.FreeCoTaskMem(cds.lpData);
ms.Close();
}
}
But I think I'm not passing the memory stream to the other application. I declared the dwData as Memory Stream. Am I doing right?
|
|
|
|
|
I got it to work with the help of this website.
https://github.com/jimschubert/wixedit/blob/master/src/Helpers/CopyDataMessenger.cs
to jim
Thanks all for your help.
Thanks
|
|
|
|
|
HI,
I want to know what is Lifo and Fifo,as i search in net but i didn't get the answer clearly???
Can any one explain it with simple example???
Thanks...
|
|
|
|
|
LIFO - last in first out
FIFO - first in first out or fly in fly out (mining employees do this in remote sites)
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
|
|
I did something similar here:
Mediator - a communicator between ViewModels[^]
I.a:
Type unboundWEMType = typeof(WeakEventManager<,>);
Type[] typeArgs = { _sender.Target.GetType(), typeof(EventArgs) };
Type constructedWEMType = unboundWEMType.MakeGenericType(typeArgs);
etc...
It's a pain. 
|
|
|
|
|
Kenneth Haugland wrote:
It's a pain.
Haha, it can be indeed!
|
|
|
|
|
I don't quite understand your problem, if you could make the Generic01 with the code I created above, surely you could get the type from the created element?
|
|
|
|
|
It's for a serializer, I need to recreate the type that was saved.
Not the type that is now.
It might have changed!
|
|
|
|
|
Using fieldType.ToString() would give you System.Collections.Generic.List`1[T] .
If the class had multiple type parameters, it might be important to know which one was used in the type.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Simple!
|
|
|
|
|
Richard Deeming wrote: t might be important to know which one was used in the type.
Ha yes! another bug!
|
|
|
|
|
And in my usual fashion of cobbling together source codes before I have grasped the concepts, I give you this glorious error:
No overload for method 'PassStructIn' takes 4 arguments
The code in question happens to be a call to an unmanaged dll:
class Program
{
public struct Quaternion
{
double w; double x; double y; double z;
}
[DllImport("YLScsDrawing.dll")]
public static extern void PassStructIn(ref Quaternion myQuaternion);
static void Main(string[] args)
{
Program.Quaternion myQuaternion;
Program.PassStructIn(ref myQuaternion);
Thread absoluteThread = new Thread(unused => Program.PassStructIn((double)absW, (double)absX, (double)absY, (double)absZ));
absoluteThread.Start();
Please advise on how to fix this...
Thanks.
|
|
|
|
|
You'd need to know how many arguments are expected. The code complains that there is no method accepting four arguments.
I'd also advise against using a lambda to start a thread.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
You define PassStructIn as taking a single parameter: a reference to a structure you defined above.
Then you try to call it by passing four parameters...and you are surprised you get an error?
Create an instance of the struct and fill in it's fields. Then pass the ref struct to the external method.
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
Perhaps showing the code for the dll will help...
using System;
using System.Collections.Generic;
using System.Text;
namespace YLScsDrawing.Drawing3d
{
public struct Quaternion
{
public double X, Y, Z, W;
public Quaternion(double w, double x, double y, double z)
{
W = w; X = x; Y = y; Z = z;
}
}
}
Any suggestions?
|
|
|
|
|
Well... you could always try:
Quaternion quat = new Quaternion ((double)absW, (double)absX, (double)absY, (double)absZ));
Thread absoluteThread = new Thread(unused => Program.PassStructIn(ref quat);
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
The line of code...
Quaternion quat = new Quaternion ((double)absW, (double)absX, (double)absY, (double)absZ);
Brings up the following error.
'Siren.Program.Quaternion' does not contain a constructor that takes 4 arguments
Any other ideas?
|
|
|
|
|
According to your code sample it does:
public struct Quaternion
{
public double X, Y, Z, W;
public Quaternion(double w, double x, double y, double z)
{
W = w; X = x; Y = y; Z = z;
}
}
If that is in a separate DLL, then I'd suggest that you check you are referencing the latest version, and that it compiles without errors.
Because your code samples are referring to different struct names:
Siren.Program.Quaternion in the error message instead of the code sample YLScsDrawing.Drawing3d.Quaternion
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
I have a collection, which uses BindingOperations.EnableCollectionSynchronization. This works great for updating a collection on a background thread using the BackgroundWorker class; however, if the collection is in the process of updating, none of the items properties can be changed elsewhere until the worker has stopped (or so it appears).
The application ends up crashing and I assume this is because only one thread may have access to an object at any given time. If this is correct, how can I prevent the application from crashing?
The issue isn't accessing the collection on the background thread, it's allowing access elsewhere in main thread while collection is updating on background thread.
|
|
|
|
|
I am not sure what your problem is, nor I have use that method myself before, but looking at the documentation:
BindingOperations.EnableCollectionSynchronization Method (IEnumerable, Object) (System.Windows.Data)[^]
I can see that it is used to lock the connection. Hence it might be why you can't access it from another thread hey?
As a side topic, when I do multithread with my ViewModels I usually make sure my VM is thread safe or won't be broken by my code. And I fire all notifications change myself in the UI thread using Dispatcher.BeginInvoke()
In the case of a collection you might want to write your own "ThreadObservableCollection "
|
|
|
|