|
There is a little fix :
correct solution
public class Win32
{
private Win32()
{
}
[StructLayout(LayoutKind.Sequential)]
public struct SystemTime
{
[MarshalAs(UnmanagedType.U2)]
public short Year;
[MarshalAs(UnmanagedType.U2)]
public short Month;
[MarshalAs(UnmanagedType.U2)]
public short DayOfWeek;
[MarshalAs(UnmanagedType.U2)]
public short Day;
[MarshalAs(UnmanagedType.U2)]
public short Hour;
[MarshalAs(UnmanagedType.U2)]
public short Minute;
[MarshalAs(UnmanagedType.U2)]
public short Second;
[MarshalAs(UnmanagedType.U2)]
public short Milliseconds;
}
[DllImport("kernel32.dll")]
public static extern void GetLocalTime(
out SystemTime systemTime);
[DllImport("kernel32.dll")]
public static extern void GetSystemTime(
out SystemTime systemTime);
[DllImport("kernel32.dll")]
public static extern bool SetSystemTime(
ref SystemTime systemTime);
[DllImport("kernel32.dll")]
public static extern bool SetLocalTime(
ref SystemTime systemTime);
}
....
in you method do this :
Win32.SystemTime sysTime;
sysTime.Day = 13;
Win32.SetSystemTime(ref sysTime);
Make sure that you got admin rights.
|
|
|
|
|
Hi!
Is it possible to have two instances of a classes which both instances share the same base class instance?
For example:
class Program
{
static void Main(string[] args)
{
Bar bar1 = new Bar();
Bar bar2 = new Bar();
}
}
class Foe
{
}
class Bar : Foe
{
}
Is this possible to get the instanees bar1 and bar2 to share the same base instance?
/Mc_Topaz!
|
|
|
|
|
Mc_Topaz wrote: Is this possible to get the instanees bar1 and bar2 to share the same base instance?
What is your meaning with SHARE?
Please remember to rate helpful or unhelpful answers, it lets us and people reading the forums know if our answers are any good.
|
|
|
|
|
huh
sorry i dont understand
|
|
|
|
|
Hello...
Your example code is pretty perfect and will work for sure.
Still I dont understand what you are trying to ask.
Cheers,
Saran
|
|
|
|
|
I'm a bit unsure that you are asking here. Are you asking whether you can have two classes which are the same instance, i.e. using a Singleton pattern?
|
|
|
|
|
Well, I shall try to explain what I mean by replying to my own post.
When I create a instance for the Bar class, the code will automatically create an instance in the Foe class.
So I have one Bar instance and also one Foe instance. Let's call the Bar class instance: bar1.
Later I would like one more instance of the Bar class: bar2. But in this case, I don't want a brand new instance of the Foe class.
Instead I want bar2 to have the same foe instance as bar1 have.
Is this possible?
I hope I explained it better this time.
|
|
|
|
|
Bar bar 1 = new Bar();
Bar bar2 = bar1;
|
|
|
|
|
|
No, that is not possible. Inheritance is the wrong technique for that. What you want to do is set up an association. Create a field in Bar that references the Foo object. You can then share the same Foo object between two Bar objects.
|
|
|
|
|
To extend what Colin said, take a look at using the Singleton pattern for the Foo class.
|
|
|
|
|
You spelled "Foo" wrong.
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
I think he actually means it's Bars enemy.
|
|
|
|
|
I've got some public class
class Foo
{
public int a;
public int b;
...
}
And I'd like to pass its instance to some unmanaged lib function, which has the same struct with int a, int b, etc...
C#
Foo foo = new Foo();
fixed (void* pfoo = foo) //<--------- error????
{
someFunction(pfoo);
}
[DllImport("somelib")]
static extern unsafe int someFunction(void* p);
C++
typedef struct _somestr
{
int a;
int b;
int c;
...
}SOMESTR;
__declspec(dllexport) someFunction(SOMESRT* p)
{
p->a = 10;
p->b = p->c;
}
chesnokov
|
|
|
|
|
Hi
declare your function like this :
DllImport("somelib")]
static extern unsafe int someFunction(IntPtr p);
then use marshalling to reconstruct your C++ strucutre -> into a C# 'struct' (google it)
In your DLL
Use CoTaskMemAlloc function to allocate memory
To free use CoTaskMemFree
|
|
|
|
|
?? there is a C# structure, already allocated. I need to pass it to C++ function in the dll. Please the code snippet.
chesnokov
|
|
|
|
|
As lisan said, you have to use a struct .
You probably also want this attribute:
[ StructLayout( LayoutKind.Sequential ) ]
struct ...
Then you have to take the address of the struct :
fixed( void* pfoo = & foo )
You can have a look at http://pinvoke.net/[^] for some examples.
Nick
----------------------------------
Be excellent to each other
|
|
|
|
|
fixed( void* pfoo = & foo )
Error 1 You cannot use the fixed statement to take the address of an already fixed expression
fixed (void* pp = p)
Error 1 Cannot implicitly convert type 'SomeStruct' to 'void*'
chesnokov
|
|
|
|
|
Chesnokov Yuriy wrote: fixed( void* pfoo = & foo )
Error 1 You cannot use the fixed statement to take the address of an already fixed expression
That's because foo is a local variable, so it's already in a fixed position on the stack. You can only fix objects that is in the heap.
Just get the address of the struct:
void* pfoo = &foo;
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
bingo! Put the struct as a class field and allocate it there.
Can I allocate it in a function that it goes onto heap??
chesnokov
|
|
|
|
|
You have to use IntPtr instead of void
use Marshall.CoTaskMemAlloc method to allocate
Marshall.CoTaskMemFree method to free after using your struct
|
|
|
|
|
Hello,
i want to check in a function, if a key is at the time pressed... in my example the CTRL-Key. how is that possible? I've tested it with the "key-down" event and so on, but thats not the correct what i need. i need an function, which gives me a bool-value if this key is actually pressed or not.
Any ideas? Thanks.
|
|
|
|
|
GetKeyAsyncState. It's a win32 API, so you'll p/invoke it.
Christian Graus
No longer a Microsoft MVP, but still happy to answer your questions.
|
|
|
|
|
i have a C# windows application form and i want that on clicking a button the value in a textBox should be incremented. for e.g. if i have entered 0 in the textBox ,every time i click the button the value in textBox should be incremented to 1,2,3,...and so on.But everytime the form runs the increment starts from 0. Is there any way to store the value contained in the textBox after the form closes and increment that value when i click the button when the form runs the next time?...Plz. Help
|
|
|
|
|
There are many, but depends what suits you the most. Basically, you need to save this value in some persistent store( eg flat file, database, registry etc).
At the form load, read this value from the sorce and display in that texbox.
Please remember to rate helpful or unhelpful answers, it lets us and people reading the forums know if our answers are any good.
|
|
|
|