|
Hi Dave,
I'm more than a bit confused by your code. If you want to pass a struct that contains an array, as in this native fellow:
struct myStruct {
...
int myIntegers[];
...
}
then the native side will prefer the dimension of the array to be known at compile time (so it can work out all the offsets); and the managed side must do special things to smash the array inside the struct, rather than just holding a reference. That is what
[MarshalAs(UnmanagedType.ByValArray, SizeConst=7)]
int[] myIntegers;
would do. However your code seems quite different...
|
|
|
|
|
Hi Luc,
Basically, the function takes a pointer to an array of 128 ints - the size is fixed.
It's ensuring that the array is valid - i.e. not null and has 128 elements that is the problem, and I would also like to represent the array in it's own type (SomeTypeArray ) as per the typedef.
|
|
|
|
|
1.
are you sure about the typedef; I'd expect typedef someDefinition someIdentifier;
2.
I'm still not with you. Could you give a full example of the C side?
|
|
|
|
|
This is the function:
void SomeFunction(INT * lpSomeTypeArray);
This is the typedef:
typedef INT SomeTypeArray[128];
I want to simulate the typedef by creating a struct - SomeTypeArry , and each element would logically be SomeType (a wrapper around int) - enforcing the 128 element size is the main problem.
How does the StructLayoutAttribute work with classes? If I could use a class then I can create my own default constructor - but then passing the class instance would result in the class instance reference being passed rather than the first field (the inner array reference type)? Just thinking out aloud here - need to investigate!
|
|
|
|
|
DaveyM69 wrote: typedef INT SomeTypeArray[128];
there are two unknown types in that statement, so something else needs to be added somewhere.
And I still think such a typedef is invalid.
PS: this would compile:
typedef struct {
int data[128];
} *ptrIntArray;
void SomeFunction(ptrIntArray *lpSomeArray);
|
|
|
|
|
It's straight out of the working header file
|
|
|
|
|
It looks like I can use [StructLayout(LayoutKind.Sequential)] on a class (and therefore enforce use of my constructor) and use ([MarshalAs(UnmanagedType.LPStruct)] in the function call.
I need to test this, but it seems reasonable looking at the example here[^].
|
|
|
|
|
Use classes instead of structs and make the default constructor private. By the way, when I have to use P/Invoke I always try to maintain the things as simple as possible and, in my opinion, I think you are looping the loops here. Since the C function receives an array, I would have used IntPtr type for the parameter, so I would be able to pass any array with the help of Marshal class.
|
|
|
|
|
I'm trying to see if I can check if the credentials the user provides will be able to login to a remote machine. Right now I'm using NetUseAdd to add an IPC connection but this will give error 1219 if the credentials are cached.
Any ideas?
|
|
|
|
|
Just curious, but I just saw this code and I was wondering what the difference was. The code I saw was (basically):
FontStyle style = someFont.Style;
style |= FontStyle.Italic;
How is that any different than:
FontStyle style = someFont.Style;
style = FontStyle.Italic;
|
|
|
|
|
The pipe operator (|) is a binary OR... So:
style |= FontStyle.Italic
...is equivalent to...
style = style | FontStyle.Italic
If style is initially zero, this is the same as a straight assignment (0 | x == x), but if you already have an existing value in there (Maybe 'Bold' is another value), the |= operator would make it Italic AND Bold, while an assignment would replace Bold with Italic.
(This only makes sense with flags-type enumerations, of course)
|
|
|
|
|
Ah...thanks...makes sense!
|
|
|
|
|
Ian Shlasko wrote: (This only makes sense with flags-type enumerations, of course)
That is not necessarily true.
|
|
|
|
|
Well if it's a regular enumeration (Consecutive integers), you're generally not going to be adding/removing values via bitwise operations... Sure, there could be exceptions, but I can't think of any off-hand.
|
|
|
|
|
That does make sense, depending on your meaning. If you mean this:
public enum MyEnum
{
x = 0,
a = 1,
b = 2,
c = 4,
d = 8
}
Then yeah, it works perfectly fine. If you meant this:
[Flags]
public enum MyEnum
{
x = 0,
a = 1,
b = 2,
c = 4,
d = 8
}
The "Flags" attribute is not actually necessary for the bitwise operations to be successful. It just adds intellisense and changes the behavior of ToString (e.g., it may output "a, d" rather than "9").
|
|
|
|
|
Correct. And there are also cases like:
public enum Side
{
None = 0 ,
Left = 1 ,
Right = 2 ,
Both = 3
}
where all the bases are covered and you gain nothing by using Flags.
|
|
|
|
|
I know... I meant "flags-type" as a way of describing them (Wasn't sure if he was familiar with the term "bitmask")... The attribute is just gravy.
|
|
|
|
|
I didn't know that. Or if I did, I forgot.
|
|
|
|
|
|
In C/C++/Java/C# |= is to || or | what += is to + .
So it is a bit-wise or a logical assign-OR, depending on the operands' types.
|
|
|
|
|
Haha, sorry Luc, great answer, but I have to tell you how I read this:
Luc Pattyn wrote: |= is to || or | what += is to +
"or equals is to or or or what plus equals is to plus"
|
|
|
|
|
William Winner wrote: FontStyle style = someFont.Style;
style = FontStyle.Italic;
This is not equivalent to the first version, which effectively could be written as
FontStyle style = someFont.Style | FontStyle.Italic; This means that you are doing a logicalbitwise OR on the style, whereas your example here overwrites the style.
[Edit]Thanks for pointing out the error in this statement goes to Luc.
I'm not a stalker, I just know things. Oh by the way, you're out of milk. Forgive your enemies - it messes with their heads
My blog | My articles | MoXAML PowerToys | Onyx
modified on Monday, January 3, 2011 3:26 PM
|
|
|
|
|
as FontStyle is an enum, hence a numeric, it would be a bit-wise OR, not a logical one.
|
|
|
|
|
Doh. I completely forgot it was an enum. Slaps side of head.
|
|
|
|
|
Don't feel bad... Luc did too... He had fixed it by the time I clicked Reply on his post to point it out
|
|
|
|