To cast or not to cast?

J

Jeremy

Hi,

I'm trying to convert the following types into types that I can insert in an
SQL database (via a webservice). None of these however are accepted by Sql
(i.e., there is no OleDbType for them). I could only use integer type for
UInt32, that's about it. I'm totally unsure about the other types. What I've
tried doing so far is casting them prior to sending them to the webservice.
When inserting them I get errors though. Would anyone know/could point me to
types that I could use? Any help would be really appreciated, i'm lost!

Thanks so much!


System.UInt32 Length;
System.Byte HeaderVersion;
BioAPI_BIR_DATA_TYPE Type;
System.UInt16 FormatOwner;
System.UInt16 FormatID;
System.Byte Quality; /*INT8 BioAPI_QUALITY*/
BioAPI_BIR_PURPOSE Purpose;
BioAPI_BIR_AUTH_FACTORS FactorsMask;
System.IntPtr BiometricData;
System.IntPtr Signature;
 
A

Alex Feinman [MVP]

Byte is tinyint, Uint16 is smallint. IntPtr is a pointer to data. You need
to get that data as bytearray and use varbinary or image data type
Same applies to structures
 
I

Ilya Tumanov [MS]

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/
frlrfsystemdatasqldbtypeclasstopic.asp

UInt32: Int will do. Signed and Unsigned integers are actually the same;
just cast them to the right type.
UInt16: SmallInt, see warning above
Byte: TinyInt
BioAPI_*: look up underlying type definition and use it. Enums are Int32 by
default.
IntPtr: it's Int32, so store it as Int.

Note, however, it's probably pointless to store pointers in the data base.
Pointer itself is not important, most likely you need to store whatever
it's pointing to.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.

--------------------
 
J

Jeremy

Thanks so much for the replies Alex and Ilya!

I changed the types in sql. It wasn't happy with Uint16 mapped to smallint
(sql says value is either too small or too large), so I just went for an
int.

Not sure how to retrieve the data data an IntPtr is pointing to though. How
can I get that data as a byte array?

thanks so much again!

"Ilya Tumanov [MS]" said:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/
frlrfsystemdatasqldbtypeclasstopic.asp

UInt32: Int will do. Signed and Unsigned integers are actually the same;
just cast them to the right type.
UInt16: SmallInt, see warning above
Byte: TinyInt
BioAPI_*: look up underlying type definition and use it. Enums are Int32 by
default.
IntPtr: it's Int32, so store it as Int.

Note, however, it's probably pointless to store pointers in the data base.
Pointer itself is not important, most likely you need to store whatever
it's pointing to.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.
--------------------
From: "Jeremy" <[email protected]>
Subject: To cast or not to cast?
Date: Fri, 8 Apr 2005 00:21:17 +0100
Lines: 25
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!tk2msftngp13.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.framework.compactframework:26546
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Hi,

I'm trying to convert the following types into types that I can insert
in
an
SQL database (via a webservice). None of these however are accepted by Sql
(i.e., there is no OleDbType for them). I could only use integer type for
UInt32, that's about it. I'm totally unsure about the other types. What I've
tried doing so far is casting them prior to sending them to the webservice.
When inserting them I get errors though. Would anyone know/could point
me
to
types that I could use? Any help would be really appreciated, i'm lost!

Thanks so much!


System.UInt32 Length;
System.Byte HeaderVersion;
BioAPI_BIR_DATA_TYPE Type;
System.UInt16 FormatOwner;
System.UInt16 FormatID;
System.Byte Quality; /*INT8 BioAPI_QUALITY*/
BioAPI_BIR_PURPOSE Purpose;
BioAPI_BIR_AUTH_FACTORS FactorsMask;
System.IntPtr BiometricData;
System.IntPtr Signature;
 
I

Ilya Tumanov [MS]

While storing UInt16 as Int is OK, it will take more space. The problem
you're having is caused by range check. You might consider using
unchecked() to disable it.

System.Runtime.InteropServices.Marshal class allows you to copy data from
the pointer to the array. Look into Copy() methods of that class.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.
--------------------
 
J

Jeremy

Thanks a lot for that! Before going to the UInt16 problem, I better try to
solve that IntPtr problem.

Managed to use Marshal.Copy. Not sure how I should 'guess' the length of the
Byte array to copy to. When I type FirstBIRSample.BiometricData (which is
the IntPtr) in the command window, it returns to me: 2372256 - is this the
size?
I 'assumed' the size would be 1040 (which is stored in
FirstBIRSample.Length).

Second Part: Seems like the FirstBIRSample.Signature (also a pointer) is 0,
how should I store this?

Thanks so much!

"Ilya Tumanov [MS]" said:
While storing UInt16 as Int is OK, it will take more space. The problem
you're having is caused by range check. You might consider using
unchecked() to disable it.

System.Runtime.InteropServices.Marshal class allows you to copy data from
the pointer to the array. Look into Copy() methods of that class.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.
Subject: Re: To cast or not to cast?
Date: Fri, 8 Apr 2005 10:44:39 +0100
Lines: 91
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#t8wc#[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.framework.compactframework:26572
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Thanks so much for the replies Alex and Ilya!

I changed the types in sql. It wasn't happy with Uint16 mapped to smallint
(sql says value is either too small or too large), so I just went for an
int.

Not sure how to retrieve the data data an IntPtr is pointing to though. How
can I get that data as a byte array?

thanks so much again!
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/
Int32
by insert
in by
Sql type
for point
me
 
I

Ilya Tumanov [MS]

You should not guess the length, you should know it. It might be fixed or
native code could return it somehow.
Most likely you're correct and FirstBIRSample.Length contains this size.
You should check out the documentation for the function you're calling to
make sure it's correct.

If value of a pointer is 0, it's null pointer. It means this pointer is not
valid and points to nothing.
Since no data is available, you could store it as DBNull.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.

--------------------
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sat, 9 Apr 2005 22:32:29 +0100
Lines: 159
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.framework.compactframework:26653
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Thanks a lot for that! Before going to the UInt16 problem, I better try to
solve that IntPtr problem.

Managed to use Marshal.Copy. Not sure how I should 'guess' the length of the
Byte array to copy to. When I type FirstBIRSample.BiometricData (which is
the IntPtr) in the command window, it returns to me: 2372256 - is this the
size?
I 'assumed' the size would be 1040 (which is stored in
FirstBIRSample.Length).

Second Part: Seems like the FirstBIRSample.Signature (also a pointer) is 0,
how should I store this?

Thanks so much!

"Ilya Tumanov [MS]" said:
While storing UInt16 as Int is OK, it will take more space. The problem
you're having is caused by range check. You might consider using
unchecked() to disable it.

System.Runtime.InteropServices.Marshal class allows you to copy data from
the pointer to the array. Look into Copy() methods of that class.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.
Subject: Re: To cast or not to cast?
Date: Fri, 8 Apr 2005 10:44:39 +0100
Lines: 91
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#t8wc#[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.framework.compactframework:26572
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Thanks so much for the replies Alex and Ilya!

I changed the types in sql. It wasn't happy with Uint16 mapped to smallint
(sql says value is either too small or too large), so I just went for an
int.

Not sure how to retrieve the data data an IntPtr is pointing to
though.
How
can I get that data as a byte array?

thanks so much again!
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/ accepted
 
J

Jeremy

Okay, so I used the 1040 length, it doesn't seem to complain, which is good
news I guess. To make sure it stores the data correctly I'm trying to
retrieve it and feed it back to the biometric template matching method.

Because it takes IntPtr's for BiometricData and Signature, I tried creating
new pointers and marshal copy the content that I retrieved earlier into
these pointers. I failed. I tried the following:

System.IntPtr BiometricDataPtr;//create new pointer
BiometricData = (byte[])bioData[8];//BiometricData is an array of type byte
Marshal.Copy(BiometricData, 0, BiometricDataPtr, 1040);//copy content of
BiometricData in an IntPtr

"Use of unassigned local variable 'BiometricDataPtr'."
Obvsiously it's unused, it's meant to point to something... what am I
missing here?

"Ilya Tumanov [MS]" said:
You should not guess the length, you should know it. It might be fixed or
native code could return it somehow.
Most likely you're correct and FirstBIRSample.Length contains this size.
You should check out the documentation for the function you're calling to
make sure it's correct.

If value of a pointer is 0, it's null pointer. It means this pointer is not
valid and points to nothing.
Since no data is available, you could store it as DBNull.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sat, 9 Apr 2005 22:32:29 +0100
Lines: 159
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.framework.compactframework:26653
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Thanks a lot for that! Before going to the UInt16 problem, I better try to
solve that IntPtr problem.

Managed to use Marshal.Copy. Not sure how I should 'guess' the length of the
Byte array to copy to. When I type FirstBIRSample.BiometricData (which is
the IntPtr) in the command window, it returns to me: 2372256 - is this the
size?
I 'assumed' the size would be 1040 (which is stored in
FirstBIRSample.Length).

Second Part: Seems like the FirstBIRSample.Signature (also a pointer) is 0,
how should I store this?

Thanks so much!

"Ilya Tumanov [MS]" said:
While storing UInt16 as Int is OK, it will take more space. The problem
you're having is caused by range check. You might consider using
unchecked() to disable it.

System.Runtime.InteropServices.Marshal class allows you to copy data from
the pointer to the array. Look into Copy() methods of that class.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.
--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Fri, 8 Apr 2005 10:44:39 +0100
Lines: 91
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#t8wc#[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26572
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Thanks so much for the replies Alex and Ilya!

I changed the types in sql. It wasn't happy with Uint16 mapped to smallint
(sql says value is either too small or too large), so I just went
for
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/
 
I

Ilya Tumanov [MS]

Creating a new pointer is not enough. You need to allocate memory and
assign value pointing to it to the pointer.
You might allocate native memory via P/Invoke (which you would have to free
at some point).
Or, you can obtain a pointer to a managed array you already have.
Before you pass this pointer to a native code, you have to pin managed
memory so GC won't move the array.
You can use GCHandle class for it or you can use unsafe code.
I would recommend using Fixed() with unsafe pointer. That would pin and
unpin the array automatically.
GCHandle has a bug (returns incorrect pointer - there's a workaround) and
it's not automatic.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.

--------------------
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 01:46:03 +0100
Lines: 240
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.framework.compactframework:26658
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Okay, so I used the 1040 length, it doesn't seem to complain, which is good
news I guess. To make sure it stores the data correctly I'm trying to
retrieve it and feed it back to the biometric template matching method.

Because it takes IntPtr's for BiometricData and Signature, I tried creating
new pointers and marshal copy the content that I retrieved earlier into
these pointers. I failed. I tried the following:

System.IntPtr BiometricDataPtr;//create new pointer
BiometricData = (byte[])bioData[8];//BiometricData is an array of type byte
Marshal.Copy(BiometricData, 0, BiometricDataPtr, 1040);//copy content of
BiometricData in an IntPtr

"Use of unassigned local variable 'BiometricDataPtr'."
Obvsiously it's unused, it's meant to point to something... what am I
missing here?

"Ilya Tumanov [MS]" said:
You should not guess the length, you should know it. It might be fixed or
native code could return it somehow.
Most likely you're correct and FirstBIRSample.Length contains this size.
You should check out the documentation for the function you're calling to
make sure it's correct.

If value of a pointer is 0, it's null pointer. It means this pointer is not
valid and points to nothing.
Since no data is available, you could store it as DBNull.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sat, 9 Apr 2005 22:32:29 +0100
Lines: 159
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.framework.compactframework:26653
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Thanks a lot for that! Before going to the UInt16 problem, I better
try
to of
the is
0, for
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/
 
J

Jeremy

I did a little bit of research because I'm a newbie regarding
pointers/memory allocation. I found an interesting post by Brian Smith:
http://groups-beta.google.com/group...aged+allocate+memory&rnum=10#b92cb386364174f7

I supose I could use LocalAlloc to allocate memory. The post seems to be
similar to my problem but I still don't understand how to pin managed memory
(by using Fixed()?), and have a pointer point to the byte array (which is
probably what I would want to do) ?

your help is really appreciated!

"Ilya Tumanov [MS]" said:
Creating a new pointer is not enough. You need to allocate memory and
assign value pointing to it to the pointer.
You might allocate native memory via P/Invoke (which you would have to free
at some point).
Or, you can obtain a pointer to a managed array you already have.
Before you pass this pointer to a native code, you have to pin managed
memory so GC won't move the array.
You can use GCHandle class for it or you can use unsafe code.
I would recommend using Fixed() with unsafe pointer. That would pin and
unpin the array automatically.
GCHandle has a bug (returns incorrect pointer - there's a workaround) and
it's not automatic.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 01:46:03 +0100
Lines: 240
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.framework.compactframework:26658
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Okay, so I used the 1040 length, it doesn't seem to complain, which is good
news I guess. To make sure it stores the data correctly I'm trying to
retrieve it and feed it back to the biometric template matching method.

Because it takes IntPtr's for BiometricData and Signature, I tried creating
new pointers and marshal copy the content that I retrieved earlier into
these pointers. I failed. I tried the following:

System.IntPtr BiometricDataPtr;//create new pointer
BiometricData = (byte[])bioData[8];//BiometricData is an array of type byte
Marshal.Copy(BiometricData, 0, BiometricDataPtr, 1040);//copy content of
BiometricData in an IntPtr

"Use of unassigned local variable 'BiometricDataPtr'."
Obvsiously it's unused, it's meant to point to something... what am I
missing here?

"Ilya Tumanov [MS]" said:
You should not guess the length, you should know it. It might be fixed or
native code could return it somehow.
Most likely you're correct and FirstBIRSample.Length contains this size.
You should check out the documentation for the function you're calling to
make sure it's correct.

If value of a pointer is 0, it's null pointer. It means this pointer
is
not
valid and points to nothing.
Since no data is available, you could store it as DBNull.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.

--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sat, 9 Apr 2005 22:32:29 +0100
Lines: 159
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26653
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Thanks a lot for that! Before going to the UInt16 problem, I better
try
to
solve that IntPtr problem.

Managed to use Marshal.Copy. Not sure how I should 'guess' the
length
of (which
is this
the
pointer)
is went
for
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/
the
data confers
no appreciated,
i'm
 
I

Ilya Tumanov [MS]

You don't need to do anything to pin memory with fixed(), fixed() will do
it for you:

fixed(void *ArrayPointer = MyManagedArray) {
// MyManagedArray is pinned within fixed block and ArrayPointer points to
it.
// Assign it to IntPtr (might need some casting) and call native function
within this block.
}

// MyManagedArray in longer pinned...

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.
--------------------
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 20:37:43 +0100
Lines: 335
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP15.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.framework.compactframework:26681
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

I did a little bit of research because I'm a newbie regarding
pointers/memory allocation. I found an interesting post by Brian Smith:
http://groups-beta.google.com/group/microsoft.public.dotnet.framework.compac
tframework/browse_frm/thread/d628847ac90ac8a3/b92cb386364174f7?q=unmanaged+a
llocate+memory&rnum=10#b92cb386364174f7

I supose I could use LocalAlloc to allocate memory. The post seems to be
similar to my problem but I still don't understand how to pin managed memory
(by using Fixed()?), and have a pointer point to the byte array (which is
probably what I would want to do) ?

your help is really appreciated!

"Ilya Tumanov [MS]" said:
Creating a new pointer is not enough. You need to allocate memory and
assign value pointing to it to the pointer.
You might allocate native memory via P/Invoke (which you would have to free
at some point).
Or, you can obtain a pointer to a managed array you already have.
Before you pass this pointer to a native code, you have to pin managed
memory so GC won't move the array.
You can use GCHandle class for it or you can use unsafe code.
I would recommend using Fixed() with unsafe pointer. That would pin and
unpin the array automatically.
GCHandle has a bug (returns incorrect pointer - there's a workaround) and
it's not automatic.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 01:46:03 +0100
Lines: 240
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.framework.compactframework:26658
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Okay, so I used the 1040 length, it doesn't seem to complain, which is good
news I guess. To make sure it stores the data correctly I'm trying to
retrieve it and feed it back to the biometric template matching method.

Because it takes IntPtr's for BiometricData and Signature, I tried creating
new pointers and marshal copy the content that I retrieved earlier into
these pointers. I failed. I tried the following:

System.IntPtr BiometricDataPtr;//create new pointer
BiometricData = (byte[])bioData[8];//BiometricData is an array of type byte
Marshal.Copy(BiometricData, 0, BiometricDataPtr, 1040);//copy content of
BiometricData in an IntPtr

"Use of unassigned local variable 'BiometricDataPtr'."
Obvsiously it's unused, it's meant to point to something... what am I
missing here?

You should not guess the length, you should know it. It might be
fixed
or
native code could return it somehow.
Most likely you're correct and FirstBIRSample.Length contains this size.
You should check out the documentation for the function you're
calling
to
make sure it's correct.

If value of a pointer is 0, it's null pointer. It means this pointer is
not
valid and points to nothing.
Since no data is available, you could store it as DBNull.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no
rights.

--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sat, 9 Apr 2005 22:32:29 +0100
Lines: 159
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26653
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Thanks a lot for that! Before going to the UInt16 problem, I
better
try
to
solve that IntPtr problem.

Managed to use Marshal.Copy. Not sure how I should 'guess' the
length
of
the
Byte array to copy to. When I type FirstBIRSample.BiometricData (which
is
the IntPtr) in the command window, it returns to me: 2372256 - is this
the
size?
I 'assumed' the size would be 1040 (which is stored in
FirstBIRSample.Length).

Second Part: Seems like the FirstBIRSample.Signature (also a
pointer)
is
0,
how should I store this?

Thanks so much!

While storing UInt16 as Int is OK, it will take more space. The
problem
you're having is caused by range check. You might consider using
unchecked() to disable it.

System.Runtime.InteropServices.Marshal class allows you to copy data
from
the pointer to the array. Look into Copy() methods of that class.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no
rights.
--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Fri, 8 Apr 2005 10:44:39 +0100
Lines: 91
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#t8wc#[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26572
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Thanks so much for the replies Alex and Ilya!

I changed the types in sql. It wasn't happy with Uint16 mapped to
smallint
(sql says value is either too small or too large), so I just went
for
an
int.

Not sure how to retrieve the data data an IntPtr is pointing to
though.
How
can I get that data as a byte array?

thanks so much again!

message
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/
actually
the Enums
are I
can to
the
 
G

Guest

Though fixed won't allocate any memory for you, so you're still where you
were before.

-Chris


"Ilya Tumanov [MS]" said:
You don't need to do anything to pin memory with fixed(), fixed() will do
it for you:

fixed(void *ArrayPointer = MyManagedArray) {
// MyManagedArray is pinned within fixed block and ArrayPointer points to
it.
// Assign it to IntPtr (might need some casting) and call native function
within this block.
}

// MyManagedArray in longer pinned...

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no
rights.
--------------------
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 20:37:43 +0100
Lines: 335
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP15.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.framework.compactframework:26681
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

I did a little bit of research because I'm a newbie regarding
pointers/memory allocation. I found an interesting post by Brian Smith:
http://groups-beta.google.com/group/microsoft.public.dotnet.framework.compac
tframework/browse_frm/thread/d628847ac90ac8a3/b92cb386364174f7?q=unmanaged+a
llocate+memory&rnum=10#b92cb386364174f7

I supose I could use LocalAlloc to allocate memory. The post seems to be
similar to my problem but I still don't understand how to pin managed memory
(by using Fixed()?), and have a pointer point to the byte array (which
is
probably what I would want to do) ?

your help is really appreciated!

"Ilya Tumanov [MS]" said:
Creating a new pointer is not enough. You need to allocate memory and
assign value pointing to it to the pointer.
You might allocate native memory via P/Invoke (which you would have to free
at some point).
Or, you can obtain a pointer to a managed array you already have.
Before you pass this pointer to a native code, you have to pin managed
memory so GC won't move the array.
You can use GCHandle class for it or you can use unsafe code.
I would recommend using Fixed() with unsafe pointer. That would pin and
unpin the array automatically.
GCHandle has a bug (returns incorrect pointer - there's a workaround) and
it's not automatic.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.

--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 01:46:03 +0100
Lines: 240
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26658
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Okay, so I used the 1040 length, it doesn't seem to complain, which
is
good
news I guess. To make sure it stores the data correctly I'm trying to
retrieve it and feed it back to the biometric template matching method.

Because it takes IntPtr's for BiometricData and Signature, I tried
creating
new pointers and marshal copy the content that I retrieved earlier into
these pointers. I failed. I tried the following:

System.IntPtr BiometricDataPtr;//create new pointer
BiometricData = (byte[])bioData[8];//BiometricData is an array of
type
byte
Marshal.Copy(BiometricData, 0, BiometricDataPtr, 1040);//copy content of
BiometricData in an IntPtr

"Use of unassigned local variable 'BiometricDataPtr'."
Obvsiously it's unused, it's meant to point to something... what am I
missing here?

You should not guess the length, you should know it. It might be fixed
or
native code could return it somehow.
Most likely you're correct and FirstBIRSample.Length contains this size.
You should check out the documentation for the function you're calling
to
make sure it's correct.

If value of a pointer is 0, it's null pointer. It means this
pointer is
not
valid and points to nothing.
Since no data is available, you could store it as DBNull.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no
rights.

--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sat, 9 Apr 2005 22:32:29 +0100
Lines: 159
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26653
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Thanks a lot for that! Before going to the UInt16 problem, I better
try
to
solve that IntPtr problem.

Managed to use Marshal.Copy. Not sure how I should 'guess' the length
of
the
Byte array to copy to. When I type FirstBIRSample.BiometricData (which
is
the IntPtr) in the command window, it returns to me: 2372256 - is this
the
size?
I 'assumed' the size would be 1040 (which is stored in
FirstBIRSample.Length).

Second Part: Seems like the FirstBIRSample.Signature (also a pointer)
is
0,
how should I store this?

Thanks so much!

While storing UInt16 as Int is OK, it will take more space. The
problem
you're having is caused by range check. You might consider
using
unchecked() to disable it.

System.Runtime.InteropServices.Marshal class allows you to copy data
from
the pointer to the array. Look into Copy() methods of that class.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and
confers no
rights.
--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Fri, 8 Apr 2005 10:44:39 +0100
Lines: 91
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#t8wc#[email protected]>
Newsgroups:
microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com
84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26572
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Thanks so much for the replies Alex and Ilya!

I changed the types in sql. It wasn't happy with Uint16
mapped to
smallint
(sql says value is either too small or too large), so I just went
for
an
int.

Not sure how to retrieve the data data an IntPtr is pointing to
though.
How
can I get that data as a byte array?

thanks so much again!

message
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/
frlrfsystemdatasqldbtypeclasstopic.asp

UInt32: Int will do. Signed and Unsigned integers are actually
the
same;
just cast them to the right type.
UInt16: SmallInt, see warning above
Byte: TinyInt
BioAPI_*: look up underlying type definition and use it. Enums
are
Int32
by
default.
IntPtr: it's Int32, so store it as Int.

Note, however, it's probably pointless to store pointers in the
data
base.
Pointer itself is not important, most likely you need to store
whatever
it's pointing to.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers
no
rights.

--------------------
From: "Jeremy" <[email protected]>
Subject: To cast or not to cast?
Date: Fri, 8 Apr 2005 00:21:17 +0100
Lines: 25
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!tk2msftngp13.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26546
X-Tomcat-NG:
microsoft.public.dotnet.framework.compactframework

Hi,

I'm trying to convert the following types into types that I
can
insert
in
an
SQL database (via a webservice). None of these however
are
accepted
by
Sql
(i.e., there is no OleDbType for them). I could only use
integer
type
for
UInt32, that's about it. I'm totally unsure about the other
types.
What
I've
tried doing so far is casting them prior to sending them to
the
webservice.
When inserting them I get errors though. Would anyone
know/could
point
me
to
types that I could use? Any help would be really appreciated,
i'm
lost!

Thanks so much!


System.UInt32 Length;
System.Byte HeaderVersion;
BioAPI_BIR_DATA_TYPE Type;
System.UInt16 FormatOwner;
System.UInt16 FormatID;
System.Byte Quality; /*INT8 BioAPI_QUALITY*/
BioAPI_BIR_PURPOSE Purpose;
BioAPI_BIR_AUTH_FACTORS FactorsMask;
System.IntPtr BiometricData;
System.IntPtr Signature;
 
I

Ilya Tumanov [MS]

It won't, but managed array (retrieved from SQL CE) should be already
allocated.



Best regards,



Ilya



This posting is provided "AS IS" with no warranties, and confers no rights.


Though fixed won't allocate any memory for you, so you're still where you
were before.

-Chris


"Ilya Tumanov [MS]" said:
You don't need to do anything to pin memory with fixed(), fixed() will do
it for you:

fixed(void *ArrayPointer = MyManagedArray) {
// MyManagedArray is pinned within fixed block and ArrayPointer points to
it.
// Assign it to IntPtr (might need some casting) and call native function
within this block.
}

// MyManagedArray in longer pinned...

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no
rights.
--------------------
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 20:37:43 +0100
Lines: 335
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP15.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.framework.compactframework:26681
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

I did a little bit of research because I'm a newbie regarding
pointers/memory allocation. I found an interesting post by Brian Smith:
http://groups-beta.google.com/group/microsoft.public.dotnet.framework.compac
tframework/browse_frm/thread/d628847ac90ac8a3/b92cb386364174f7?q=unmanaged+a
llocate+memory&rnum=10#b92cb386364174f7

I supose I could use LocalAlloc to allocate memory. The post seems to be
similar to my problem but I still don't understand how to pin managed memory
(by using Fixed()?), and have a pointer point to the byte array (which
is
probably what I would want to do) ?

your help is really appreciated!

Creating a new pointer is not enough. You need to allocate memory and
assign value pointing to it to the pointer.
You might allocate native memory via P/Invoke (which you would have to
free
at some point).
Or, you can obtain a pointer to a managed array you already have.
Before you pass this pointer to a native code, you have to pin managed
memory so GC won't move the array.
You can use GCHandle class for it or you can use unsafe code.
I would recommend using Fixed() with unsafe pointer. That would pin
and
unpin the array automatically.
GCHandle has a bug (returns incorrect pointer - there's a workaround) and
it's not automatic.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no
rights.

--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 01:46:03 +0100
Lines: 240
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26658
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Okay, so I used the 1040 length, it doesn't seem to complain, which
is
good
news I guess. To make sure it stores the data correctly I'm trying
to
retrieve it and feed it back to the biometric template matching method.

Because it takes IntPtr's for BiometricData and Signature, I tried
creating
new pointers and marshal copy the content that I retrieved earlier into
these pointers. I failed. I tried the following:

System.IntPtr BiometricDataPtr;//create new pointer
BiometricData = (byte[])bioData[8];//BiometricData is an array of
type
byte
Marshal.Copy(BiometricData, 0, BiometricDataPtr, 1040);//copy
content of
BiometricData in an IntPtr

"Use of unassigned local variable 'BiometricDataPtr'."
Obvsiously it's unused, it's meant to point to something... what am
I
missing here?

message
You should not guess the length, you should know it. It might be fixed
or
native code could return it somehow.
Most likely you're correct and FirstBIRSample.Length contains this
size.
You should check out the documentation for the function you're calling
to
make sure it's correct.

If value of a pointer is 0, it's null pointer. It means this
pointer
is
not
valid and points to nothing.
Since no data is available, you could store it as DBNull.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers
no
rights.

--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sat, 9 Apr 2005 22:32:29 +0100
Lines: 159
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26653
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Thanks a lot for that! Before going to the UInt16 problem, I better
try
to
solve that IntPtr problem.

Managed to use Marshal.Copy. Not sure how I should 'guess' the
length
of
the
Byte array to copy to. When I type FirstBIRSample.BiometricData
(which
is
the IntPtr) in the command window, it returns to me: 2372256 -
is
this
the
size?
I 'assumed' the size would be 1040 (which is stored in
FirstBIRSample.Length).

Second Part: Seems like the FirstBIRSample.Signature (also a
pointer)
is
0,
how should I store this?

Thanks so much!

message
While storing UInt16 as Int is OK, it will take more space.
The
problem
you're having is caused by range check. You might consider
using
unchecked() to disable it.

System.Runtime.InteropServices.Marshal class allows you to
copy
data
from
the pointer to the array. Look into Copy() methods of that class.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and
confers
no
rights.
--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Fri, 8 Apr 2005 10:44:39 +0100
Lines: 91
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#t8wc#[email protected]>
Newsgroups:
microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com
84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26572
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Thanks so much for the replies Alex and Ilya!

I changed the types in sql. It wasn't happy with Uint16
mapped
to
smallint
(sql says value is either too small or too large), so I just
went
for
an
int.

Not sure how to retrieve the data data an IntPtr is pointing to
though.
How
can I get that data as a byte array?

thanks so much again!

in
message







http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/
frlrfsystemdatasqldbtypeclasstopic.asp

UInt32: Int will do. Signed and Unsigned integers are actually
the
same;
just cast them to the right type.
UInt16: SmallInt, see warning above
Byte: TinyInt
BioAPI_*: look up underlying type definition and use it. Enums
are
Int32
by
default.
IntPtr: it's Int32, so store it as Int.

Note, however, it's probably pointless to store pointers
in
the
data
base.
Pointer itself is not important, most likely you need to store
whatever
it's pointing to.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and
confers
no
rights.

--------------------
From: "Jeremy" <[email protected]>
Subject: To cast or not to cast?
Date: Fri, 8 Apr 2005 00:21:17 +0100
Lines: 25
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups:
microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com
84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!tk2msftngp13.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26546
X-Tomcat-NG:
microsoft.public.dotnet.framework.compactframework

Hi,

I'm trying to convert the following types into types
that I
can
insert
in
an
SQL database (via a webservice). None of these however
are
accepted
by
Sql
(i.e., there is no OleDbType for them). I could only use
integer
type
for
UInt32, that's about it. I'm totally unsure about the other
types.
What
I've
tried doing so far is casting them prior to sending them to
the
webservice.
When inserting them I get errors though. Would anyone
know/could
point
me
to
types that I could use? Any help would be really
appreciated,
i'm
lost!

Thanks so much!


System.UInt32 Length;
System.Byte HeaderVersion;
BioAPI_BIR_DATA_TYPE Type;
System.UInt16 FormatOwner;
System.UInt16 FormatID;
System.Byte Quality; /*INT8 BioAPI_QUALITY*/
BioAPI_BIR_PURPOSE Purpose;
BioAPI_BIR_AUTH_FACTORS FactorsMask;
System.IntPtr BiometricData;
System.IntPtr Signature;
 
A

Alex Feinman [MVP]

Why would one want to use unsafe blocks is beyond me, when it is so easy to
call LocalAlloc and Marshal.Copy

--
Alex Feinman
---
Visit http://www.opennetcf.org
Ilya Tumanov said:
It won't, but managed array (retrieved from SQL CE) should be already
allocated.



Best regards,



Ilya



This posting is provided "AS IS" with no warranties, and confers no
rights.


Though fixed won't allocate any memory for you, so you're still where you
were before.

-Chris


"Ilya Tumanov [MS]" said:
You don't need to do anything to pin memory with fixed(), fixed() will
do
it for you:

fixed(void *ArrayPointer = MyManagedArray) {
// MyManagedArray is pinned within fixed block and ArrayPointer points
to
it.
// Assign it to IntPtr (might need some casting) and call native
function
within this block.
}

// MyManagedArray in longer pinned...

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no
rights.
--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<#[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 20:37:43 +0100
Lines: 335
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP15.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26681
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

I did a little bit of research because I'm a newbie regarding
pointers/memory allocation. I found an interesting post by Brian Smith:

http://groups-beta.google.com/group/microsoft.public.dotnet.framework.compac
tframework/browse_frm/thread/d628847ac90ac8a3/b92cb386364174f7?q=unmanaged+a
llocate+memory&rnum=10#b92cb386364174f7

I supose I could use LocalAlloc to allocate memory. The post seems to
be
similar to my problem but I still don't understand how to pin managed
memory
(by using Fixed()?), and have a pointer point to the byte array (which
is
probably what I would want to do) ?

your help is really appreciated!

Creating a new pointer is not enough. You need to allocate memory and
assign value pointing to it to the pointer.
You might allocate native memory via P/Invoke (which you would have
to
free
at some point).
Or, you can obtain a pointer to a managed array you already have.
Before you pass this pointer to a native code, you have to pin
managed
memory so GC won't move the array.
You can use GCHandle class for it or you can use unsafe code.
I would recommend using Fixed() with unsafe pointer. That would pin
and
unpin the array automatically.
GCHandle has a bug (returns incorrect pointer - there's a workaround)
and
it's not automatic.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no
rights.

--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 01:46:03 +0100
Lines: 240
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26658
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Okay, so I used the 1040 length, it doesn't seem to complain, which
is
good
news I guess. To make sure it stores the data correctly I'm trying
to
retrieve it and feed it back to the biometric template matching
method.

Because it takes IntPtr's for BiometricData and Signature, I tried
creating
new pointers and marshal copy the content that I retrieved earlier
into
these pointers. I failed. I tried the following:

System.IntPtr BiometricDataPtr;//create new pointer
BiometricData = (byte[])bioData[8];//BiometricData is an array of
type
byte
Marshal.Copy(BiometricData, 0, BiometricDataPtr, 1040);//copy
content
of
BiometricData in an IntPtr

"Use of unassigned local variable 'BiometricDataPtr'."
Obvsiously it's unused, it's meant to point to something... what am
I
missing here?

message
You should not guess the length, you should know it. It might be
fixed
or
native code could return it somehow.
Most likely you're correct and FirstBIRSample.Length contains
this
size.
You should check out the documentation for the function you're
calling
to
make sure it's correct.

If value of a pointer is 0, it's null pointer. It means this
pointer
is
not
valid and points to nothing.
Since no data is available, you could store it as DBNull.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers
no
rights.

--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sat, 9 Apr 2005 22:32:29 +0100
Lines: 159
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26653
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Thanks a lot for that! Before going to the UInt16 problem, I
better
try
to
solve that IntPtr problem.

Managed to use Marshal.Copy. Not sure how I should 'guess' the
length
of
the
Byte array to copy to. When I type FirstBIRSample.BiometricData
(which
is
the IntPtr) in the command window, it returns to me: 2372256 -
is
this
the
size?
I 'assumed' the size would be 1040 (which is stored in
FirstBIRSample.Length).

Second Part: Seems like the FirstBIRSample.Signature (also a
pointer)
is
0,
how should I store this?

Thanks so much!

message
While storing UInt16 as Int is OK, it will take more space.
The
problem
you're having is caused by range check. You might consider
using
unchecked() to disable it.

System.Runtime.InteropServices.Marshal class allows you to
copy
data
from
the pointer to the array. Look into Copy() methods of that
class.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and
confers
no
rights.
--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Fri, 8 Apr 2005 10:44:39 +0100
Lines: 91
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#t8wc#[email protected]>
Newsgroups:
microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com
84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26572
X-Tomcat-NG:
microsoft.public.dotnet.framework.compactframework

Thanks so much for the replies Alex and Ilya!

I changed the types in sql. It wasn't happy with Uint16
mapped
to
smallint
(sql says value is either too small or too large), so I
just
went
for
an
int.

Not sure how to retrieve the data data an IntPtr is
pointing
to
though.
How
can I get that data as a byte array?

thanks so much again!

in
message








http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/
frlrfsystemdatasqldbtypeclasstopic.asp

UInt32: Int will do. Signed and Unsigned integers are
actually
the
same;
just cast them to the right type.
UInt16: SmallInt, see warning above
Byte: TinyInt
BioAPI_*: look up underlying type definition and use it.
Enums
are
Int32
by
default.
IntPtr: it's Int32, so store it as Int.

Note, however, it's probably pointless to store pointers
in
the
data
base.
Pointer itself is not important, most likely you need to
store
whatever
it's pointing to.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and
confers
no
rights.

--------------------
From: "Jeremy" <[email protected]>
Subject: To cast or not to cast?
Date: Fri, 8 Apr 2005 00:21:17 +0100
Lines: 25
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE
V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups:
microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com
84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!tk2msftngp13.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26546
X-Tomcat-NG:
microsoft.public.dotnet.framework.compactframework

Hi,

I'm trying to convert the following types into types
that
I
can
insert
in
an
SQL database (via a webservice). None of these however
are
accepted
by
Sql
(i.e., there is no OleDbType for them). I could only
use
integer
type
for
UInt32, that's about it. I'm totally unsure about the
other
types.
What
I've
tried doing so far is casting them prior to sending
them
to
the
webservice.
When inserting them I get errors though. Would anyone
know/could
point
me
to
types that I could use? Any help would be really
appreciated,
i'm
lost!

Thanks so much!


System.UInt32 Length;
System.Byte HeaderVersion;
BioAPI_BIR_DATA_TYPE Type;
System.UInt16 FormatOwner;
System.UInt16 FormatID;
System.Byte Quality; /*INT8 BioAPI_QUALITY*/
BioAPI_BIR_PURPOSE Purpose;
BioAPI_BIR_AUTH_FACTORS FactorsMask;
System.IntPtr BiometricData;
System.IntPtr Signature;
 
I

Ilya Tumanov [MS]

I can see two reasons:



1. No need to free the memory after call is done.

2. No time wasted making temporary copy of something you already have.



Best regards,



Ilya


This posting is provided "AS IS" with no warranties, and confers no rights.

Alex Feinman said:
Why would one want to use unsafe blocks is beyond me, when it is so easy
to call LocalAlloc and Marshal.Copy

--
Alex Feinman
---
Visit http://www.opennetcf.org
Ilya Tumanov said:
It won't, but managed array (retrieved from SQL CE) should be already
allocated.



Best regards,



Ilya



This posting is provided "AS IS" with no warranties, and confers no
rights.


Though fixed won't allocate any memory for you, so you're still where
you were before.

-Chris


You don't need to do anything to pin memory with fixed(), fixed() will
do
it for you:

fixed(void *ArrayPointer = MyManagedArray) {
// MyManagedArray is pinned within fixed block and ArrayPointer points
to
it.
// Assign it to IntPtr (might need some casting) and call native
function
within this block.
}

// MyManagedArray in longer pinned...

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no
rights.
--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<#[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 20:37:43 +0100
Lines: 335
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP15.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26681
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

I did a little bit of research because I'm a newbie regarding
pointers/memory allocation. I found an interesting post by Brian
Smith:

http://groups-beta.google.com/group/microsoft.public.dotnet.framework.compac
tframework/browse_frm/thread/d628847ac90ac8a3/b92cb386364174f7?q=unmanaged+a
llocate+memory&rnum=10#b92cb386364174f7

I supose I could use LocalAlloc to allocate memory. The post seems to
be
similar to my problem but I still don't understand how to pin managed
memory
(by using Fixed()?), and have a pointer point to the byte array
(which is
probably what I would want to do) ?

your help is really appreciated!

Creating a new pointer is not enough. You need to allocate memory
and
assign value pointing to it to the pointer.
You might allocate native memory via P/Invoke (which you would have
to
free
at some point).
Or, you can obtain a pointer to a managed array you already have.
Before you pass this pointer to a native code, you have to pin
managed
memory so GC won't move the array.
You can use GCHandle class for it or you can use unsafe code.
I would recommend using Fixed() with unsafe pointer. That would pin
and
unpin the array automatically.
GCHandle has a bug (returns incorrect pointer - there's a
workaround)
and
it's not automatic.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no
rights.

--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 01:46:03 +0100
Lines: 240
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26658
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Okay, so I used the 1040 length, it doesn't seem to complain,
which is
good
news I guess. To make sure it stores the data correctly I'm trying
to
retrieve it and feed it back to the biometric template matching
method.

Because it takes IntPtr's for BiometricData and Signature, I tried
creating
new pointers and marshal copy the content that I retrieved earlier
into
these pointers. I failed. I tried the following:

System.IntPtr BiometricDataPtr;//create new pointer
BiometricData = (byte[])bioData[8];//BiometricData is an array of
type
byte
Marshal.Copy(BiometricData, 0, BiometricDataPtr, 1040);//copy
content
of
BiometricData in an IntPtr

"Use of unassigned local variable 'BiometricDataPtr'."
Obvsiously it's unused, it's meant to point to something... what
am I
missing here?

message
You should not guess the length, you should know it. It might be
fixed
or
native code could return it somehow.
Most likely you're correct and FirstBIRSample.Length contains
this
size.
You should check out the documentation for the function you're
calling
to
make sure it's correct.

If value of a pointer is 0, it's null pointer. It means this
pointer
is
not
valid and points to nothing.
Since no data is available, you could store it as DBNull.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers
no
rights.

--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sat, 9 Apr 2005 22:32:29 +0100
Lines: 159
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26653
X-Tomcat-NG:
microsoft.public.dotnet.framework.compactframework

Thanks a lot for that! Before going to the UInt16 problem, I
better
try
to
solve that IntPtr problem.

Managed to use Marshal.Copy. Not sure how I should 'guess' the
length
of
the
Byte array to copy to. When I type
FirstBIRSample.BiometricData
(which
is
the IntPtr) in the command window, it returns to me: 2372256 -
is
this
the
size?
I 'assumed' the size would be 1040 (which is stored in
FirstBIRSample.Length).

Second Part: Seems like the FirstBIRSample.Signature (also a
pointer)
is
0,
how should I store this?

Thanks so much!

message
While storing UInt16 as Int is OK, it will take more space.
The
problem
you're having is caused by range check. You might consider
using
unchecked() to disable it.

System.Runtime.InteropServices.Marshal class allows you to
copy
data
from
the pointer to the array. Look into Copy() methods of that
class.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and
confers
no
rights.
--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Fri, 8 Apr 2005 10:44:39 +0100
Lines: 91
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#t8wc#[email protected]>
Newsgroups:
microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com
84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26572
X-Tomcat-NG:
microsoft.public.dotnet.framework.compactframework

Thanks so much for the replies Alex and Ilya!

I changed the types in sql. It wasn't happy with Uint16
mapped
to
smallint
(sql says value is either too small or too large), so I
just
went
for
an
int.

Not sure how to retrieve the data data an IntPtr is
pointing
to
though.
How
can I get that data as a byte array?

thanks so much again!

in
message








http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/
frlrfsystemdatasqldbtypeclasstopic.asp

UInt32: Int will do. Signed and Unsigned integers are
actually
the
same;
just cast them to the right type.
UInt16: SmallInt, see warning above
Byte: TinyInt
BioAPI_*: look up underlying type definition and use it.
Enums
are
Int32
by
default.
IntPtr: it's Int32, so store it as Int.

Note, however, it's probably pointless to store pointers
in
the
data
base.
Pointer itself is not important, most likely you need to
store
whatever
it's pointing to.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and
confers
no
rights.

--------------------
From: "Jeremy" <[email protected]>
Subject: To cast or not to cast?
Date: Fri, 8 Apr 2005 00:21:17 +0100
Lines: 25
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE
V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups:
microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com
84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!tk2msftngp13.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26546
X-Tomcat-NG:
microsoft.public.dotnet.framework.compactframework

Hi,

I'm trying to convert the following types into types
that
I
can
insert
in
an
SQL database (via a webservice). None of these however
are
accepted
by
Sql
(i.e., there is no OleDbType for them). I could only
use
integer
type
for
UInt32, that's about it. I'm totally unsure about the
other
types.
What
I've
tried doing so far is casting them prior to sending
them
to
the
webservice.
When inserting them I get errors though. Would anyone
know/could
point
me
to
types that I could use? Any help would be really
appreciated,
i'm
lost!

Thanks so much!


System.UInt32 Length;
System.Byte HeaderVersion;
BioAPI_BIR_DATA_TYPE Type;
System.UInt16 FormatOwner;
System.UInt16 FormatID;
System.Byte Quality; /*INT8 BioAPI_QUALITY*/
BioAPI_BIR_PURPOSE Purpose;
BioAPI_BIR_AUTH_FACTORS FactorsMask;
System.IntPtr BiometricData;
System.IntPtr Signature;
 
J

Jeremy

I tried to follow you fixed() solution, but I get an error saying that
"Pointers can only be used in an unsafe context" and "Cannot implicitly
convert type void* to System.IntPtr.

I've got the following down. I think the bit I'm missing is the assignment
to IntPtr? And probably the casting as well.. Could you explain though what
the compiler means by the first error? I understand that this is an unsafe
block, so why does it complain?

fixed(void* BiometricDataPtr = (byte[])(bioData[8]))
{
SecondBIRSample.BiometricData = BiometricDataPtr;
}


Ilya Tumanov said:
I can see two reasons:



1. No need to free the memory after call is done.

2. No time wasted making temporary copy of something you already have.



Best regards,



Ilya


This posting is provided "AS IS" with no warranties, and confers no rights.

Alex Feinman said:
Why would one want to use unsafe blocks is beyond me, when it is so easy
to call LocalAlloc and Marshal.Copy

--
Alex Feinman
---
Visit http://www.opennetcf.org
Ilya Tumanov said:
It won't, but managed array (retrieved from SQL CE) should be already
allocated.



Best regards,



Ilya



This posting is provided "AS IS" with no warranties, and confers no
rights.


"<ctacke/>" <ctacke_AT_OpenNETCF_com> wrote in message
Though fixed won't allocate any memory for you, so you're still where
you were before.

-Chris


You don't need to do anything to pin memory with fixed(), fixed() will
do
it for you:

fixed(void *ArrayPointer = MyManagedArray) {
// MyManagedArray is pinned within fixed block and ArrayPointer points
to
it.
// Assign it to IntPtr (might need some casting) and call native
function
within this block.
}

// MyManagedArray in longer pinned...

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no
rights.
--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<#[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 20:37:43 +0100
Lines: 335
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP15.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26681
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

I did a little bit of research because I'm a newbie regarding
pointers/memory allocation. I found an interesting post by Brian
Smith:

http://groups-beta.google.com/group/microsoft.public.dotnet.framework.compac
tframework/browse_frm/thread/d628847ac90ac8a3/b92cb386364174f7?q=unmanaged+a
llocate+memory&rnum=10#b92cb386364174f7

I supose I could use LocalAlloc to allocate memory. The post seems to
be
similar to my problem but I still don't understand how to pin managed
memory
(by using Fixed()?), and have a pointer point to the byte array
(which is
probably what I would want to do) ?

your help is really appreciated!

Creating a new pointer is not enough. You need to allocate memory
and
assign value pointing to it to the pointer.
You might allocate native memory via P/Invoke (which you would have
to
free
at some point).
Or, you can obtain a pointer to a managed array you already have.
Before you pass this pointer to a native code, you have to pin
managed
memory so GC won't move the array.
You can use GCHandle class for it or you can use unsafe code.
I would recommend using Fixed() with unsafe pointer. That would pin
and
unpin the array automatically.
GCHandle has a bug (returns incorrect pointer - there's a
workaround)
and
it's not automatic.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no
rights.

--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 01:46:03 +0100
Lines: 240
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26658
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Okay, so I used the 1040 length, it doesn't seem to complain,
which is
good
news I guess. To make sure it stores the data correctly I'm trying
to
retrieve it and feed it back to the biometric template matching
method.

Because it takes IntPtr's for BiometricData and Signature, I tried
creating
new pointers and marshal copy the content that I retrieved earlier
into
these pointers. I failed. I tried the following:

System.IntPtr BiometricDataPtr;//create new pointer
BiometricData = (byte[])bioData[8];//BiometricData is an array of
type
byte
Marshal.Copy(BiometricData, 0, BiometricDataPtr, 1040);//copy
content
of
BiometricData in an IntPtr

"Use of unassigned local variable 'BiometricDataPtr'."
Obvsiously it's unused, it's meant to point to something... what
am I
missing here?

message
You should not guess the length, you should know it. It might be
fixed
or
native code could return it somehow.
Most likely you're correct and FirstBIRSample.Length contains
this
size.
You should check out the documentation for the function you're
calling
to
make sure it's correct.

If value of a pointer is 0, it's null pointer. It means this
pointer
is
not
valid and points to nothing.
Since no data is available, you could store it as DBNull.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers
no
rights.

--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sat, 9 Apr 2005 22:32:29 +0100
Lines: 159
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26653
X-Tomcat-NG:
microsoft.public.dotnet.framework.compactframework

Thanks a lot for that! Before going to the UInt16 problem, I
better
try
to
solve that IntPtr problem.

Managed to use Marshal.Copy. Not sure how I should 'guess' the
length
of
the
Byte array to copy to. When I type
FirstBIRSample.BiometricData
(which
is
the IntPtr) in the command window, it returns to me: 2372256 -
is
this
the
size?
I 'assumed' the size would be 1040 (which is stored in
FirstBIRSample.Length).

Second Part: Seems like the FirstBIRSample.Signature (also a
pointer)
is
0,
how should I store this?

Thanks so much!

message
While storing UInt16 as Int is OK, it will take more space.
The
problem
you're having is caused by range check. You might consider
using
unchecked() to disable it.

System.Runtime.InteropServices.Marshal class allows you to
copy
data
from
the pointer to the array. Look into Copy() methods of that
class.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and
confers
no
rights.
--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Fri, 8 Apr 2005 10:44:39 +0100
Lines: 91
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#t8wc#[email protected]>
Newsgroups:
microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com
84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26572
X-Tomcat-NG:
microsoft.public.dotnet.framework.compactframework

Thanks so much for the replies Alex and Ilya!

I changed the types in sql. It wasn't happy with Uint16
mapped
to
smallint
(sql says value is either too small or too large), so I
just
went
for
an
int.

Not sure how to retrieve the data data an IntPtr is
pointing
to
though.
How
can I get that data as a byte array?

thanks so much again!

in
message








http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/
frlrfsystemdatasqldbtypeclasstopic.asp

UInt32: Int will do. Signed and Unsigned integers are
actually
the
same;
just cast them to the right type.
UInt16: SmallInt, see warning above
Byte: TinyInt
BioAPI_*: look up underlying type definition and use it.
Enums
are
Int32
by
default.
IntPtr: it's Int32, so store it as Int.

Note, however, it's probably pointless to store pointers
in
the
data
base.
Pointer itself is not important, most likely you need to
store
whatever
it's pointing to.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and
confers
no
rights.

--------------------
From: "Jeremy" <[email protected]>
Subject: To cast or not to cast?
Date: Fri, 8 Apr 2005 00:21:17 +0100
Lines: 25
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE
V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups:
microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com
84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!tk2msftngp13.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26546
X-Tomcat-NG:
microsoft.public.dotnet.framework.compactframework

Hi,

I'm trying to convert the following types into types
that
I
can
insert
in
an
SQL database (via a webservice). None of these however
are
accepted
by
Sql
(i.e., there is no OleDbType for them). I could only
use
integer
type
for
UInt32, that's about it. I'm totally unsure about the
other
types.
What
I've
tried doing so far is casting them prior to sending
them
to
the
webservice.
When inserting them I get errors though. Would anyone
know/could
point
me
to
types that I could use? Any help would be really
appreciated,
i'm
lost!

Thanks so much!


System.UInt32 Length;
System.Byte HeaderVersion;
BioAPI_BIR_DATA_TYPE Type;
System.UInt16 FormatOwner;
System.UInt16 FormatID;
System.Byte Quality; /*INT8 BioAPI_QUALITY*/
BioAPI_BIR_PURPOSE Purpose;
BioAPI_BIR_AUTH_FACTORS FactorsMask;
System.IntPtr BiometricData;
System.IntPtr Signature;
 
I

Ilya Tumanov [MS]

Unsafe block won't eliminate type check (fortunately). You need to do
explicit cast:

SecondBIRSample.BiometricData = (IntPtr32)BiometricDataPtr;

First error means you need to declare this function with unsafe keyword and
use /unsafe compiler switch (can be set in project properties).

public unsafe void DoUnsafeStuff() {
// Can do unsafe stuff here...
...
}

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.
--------------------
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Tue, 12 Apr 2005 00:36:01 +0100
Lines: 560
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTFEED01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP0
9.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.framework.compactframework:26785
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

I tried to follow you fixed() solution, but I get an error saying that
"Pointers can only be used in an unsafe context" and "Cannot implicitly
convert type void* to System.IntPtr.

I've got the following down. I think the bit I'm missing is the assignment
to IntPtr? And probably the casting as well.. Could you explain though what
the compiler means by the first error? I understand that this is an unsafe
block, so why does it complain?

fixed(void* BiometricDataPtr = (byte[])(bioData[8]))
{
SecondBIRSample.BiometricData = BiometricDataPtr;
}


Ilya Tumanov said:
I can see two reasons:



1. No need to free the memory after call is done.

2. No time wasted making temporary copy of something you already have.



Best regards,



Ilya


This posting is provided "AS IS" with no warranties, and confers no rights.
http://groups-beta.google.com/group...28847ac90ac8a3/b92cb386364174f7?q=unmanaged+a
llocate+memory&rnum=10#b92cb386364174f7

I supose I could use LocalAlloc to allocate memory. The post seems to
be
similar to my problem but I still don't understand how to pin managed
memory
(by using Fixed()?), and have a pointer point to the byte array
(which is
probably what I would want to do) ?

your help is really appreciated!

Creating a new pointer is not enough. You need to allocate memory
and
assign value pointing to it to the pointer.
You might allocate native memory via P/Invoke (which you would have
to
free
at some point).
Or, you can obtain a pointer to a managed array you already have.
Before you pass this pointer to a native code, you have to pin
managed
memory so GC won't move the array.
You can use GCHandle class for it or you can use unsafe code.
I would recommend using Fixed() with unsafe pointer. That would pin
and
unpin the array automatically.
GCHandle has a bug (returns incorrect pointer - there's a
workaround)
and
it's not automatic.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no
rights.

--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 01:46:03 +0100
Lines: 240
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26658
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Okay, so I used the 1040 length, it doesn't seem to complain,
which is
good
news I guess. To make sure it stores the data correctly I'm trying
to
retrieve it and feed it back to the biometric template matching
method.

Because it takes IntPtr's for BiometricData and Signature, I tried
creating
new pointers and marshal copy the content that I retrieved earlier
into
these pointers. I failed. I tried the following:

System.IntPtr BiometricDataPtr;//create new pointer
BiometricData = (byte[])bioData[8];//BiometricData is an array of
type
byte
Marshal.Copy(BiometricData, 0, BiometricDataPtr, 1040);//copy
content
of
BiometricData in an IntPtr

"Use of unassigned local variable 'BiometricDataPtr'."
Obvsiously it's unused, it's meant to point to something... what
am I
missing here?

message
You should not guess the length, you should know it. It
might
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/ need
 
J

Jeremy

the "unsafe" keyword worked great! vs doesn't complain anymore.

I'm trying to solve the UInt16 problem now. I followed your previous advice
of using unchecked(). It still says that the value is too small or too large
when trying to insert it in the DB using OleDbType.SmallInt (which kind of
makes sense seeing as the value is 53242).

Any other ideas that could help ?

"Ilya Tumanov [MS]" said:
Unsafe block won't eliminate type check (fortunately). You need to do
explicit cast:

SecondBIRSample.BiometricData = (IntPtr32)BiometricDataPtr;

First error means you need to declare this function with unsafe keyword and
use /unsafe compiler switch (can be set in project properties).

public unsafe void DoUnsafeStuff() {
// Can do unsafe stuff here...
..
}

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Tue, 12 Apr 2005 00:36:01 +0100
Lines: 560
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTFEED01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP0
9.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.framework.compactframework:26785
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

I tried to follow you fixed() solution, but I get an error saying that
"Pointers can only be used in an unsafe context" and "Cannot implicitly
convert type void* to System.IntPtr.

I've got the following down. I think the bit I'm missing is the assignment
to IntPtr? And probably the casting as well.. Could you explain though what
the compiler means by the first error? I understand that this is an unsafe
block, so why does it complain?

fixed(void* BiometricDataPtr = (byte[])(bioData[8]))
{
SecondBIRSample.BiometricData = BiometricDataPtr;
}


Ilya Tumanov said:
I can see two reasons:



1. No need to free the memory after call is done.

2. No time wasted making temporary copy of something you already have.



Best regards,



Ilya


This posting is provided "AS IS" with no warranties, and confers no rights.

Why would one want to use unsafe blocks is beyond me, when it is so easy
to call LocalAlloc and Marshal.Copy

--
Alex Feinman
---
Visit http://www.opennetcf.org
It won't, but managed array (retrieved from SQL CE) should be already
allocated.



Best regards,



Ilya



This posting is provided "AS IS" with no warranties, and confers no
rights.


"<ctacke/>" <ctacke_AT_OpenNETCF_com> wrote in message
Though fixed won't allocate any memory for you, so you're still where
you were before.

-Chris


You don't need to do anything to pin memory with fixed(), fixed() will
do
it for you:

fixed(void *ArrayPointer = MyManagedArray) {
// MyManagedArray is pinned within fixed block and ArrayPointer points
to
it.
// Assign it to IntPtr (might need some casting) and call native
function
within this block.
}

// MyManagedArray in longer pinned...

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no
rights.
--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<#[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 20:37:43 +0100
Lines: 335
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP15.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26681
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

I did a little bit of research because I'm a newbie regarding
pointers/memory allocation. I found an interesting post by Brian
Smith:
http://groups-beta.google.com/group...28847ac90ac8a3/b92cb386364174f7?q=unmanaged+a
llocate+memory&rnum=10#b92cb386364174f7

I supose I could use LocalAlloc to allocate memory. The post
seems
to
be
similar to my problem but I still don't understand how to pin managed
memory
(by using Fixed()?), and have a pointer point to the byte array
(which is
probably what I would want to do) ?

your help is really appreciated!

Creating a new pointer is not enough. You need to allocate memory
and
assign value pointing to it to the pointer.
You might allocate native memory via P/Invoke (which you would have
to
free
at some point).
Or, you can obtain a pointer to a managed array you already have.
Before you pass this pointer to a native code, you have to pin
managed
memory so GC won't move the array.
You can use GCHandle class for it or you can use unsafe code.
I would recommend using Fixed() with unsafe pointer. That
would
pin
and
unpin the array automatically.
GCHandle has a bug (returns incorrect pointer - there's a
workaround)
and
it's not automatic.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and
confers
no
rights.

--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 01:46:03 +0100
Lines: 240
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26658
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Okay, so I used the 1040 length, it doesn't seem to complain,
which is
good
news I guess. To make sure it stores the data correctly I'm trying
to
retrieve it and feed it back to the biometric template matching
method.

Because it takes IntPtr's for BiometricData and Signature, I tried
creating
new pointers and marshal copy the content that I retrieved earlier
into
these pointers. I failed. I tried the following:

System.IntPtr BiometricDataPtr;//create new pointer
BiometricData = (byte[])bioData[8];//BiometricData is an
array
of
type
byte
Marshal.Copy(BiometricData, 0, BiometricDataPtr, 1040);//copy
content
of
BiometricData in an IntPtr

"Use of unassigned local variable 'BiometricDataPtr'."
Obvsiously it's unused, it's meant to point to something... what
am I
missing here?

message
You should not guess the length, you should know it. It
might
be
fixed
or
native code could return it somehow.
Most likely you're correct and FirstBIRSample.Length contains
this
size.
You should check out the documentation for the function you're
calling
to
make sure it's correct.

If value of a pointer is 0, it's null pointer. It means this
pointer
is
not
valid and points to nothing.
Since no data is available, you could store it as DBNull.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers
no
rights.

--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sat, 9 Apr 2005 22:32:29 +0100
Lines: 159
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26653
X-Tomcat-NG:
microsoft.public.dotnet.framework.compactframework

Thanks a lot for that! Before going to the UInt16 problem, I
better
try
to
solve that IntPtr problem.

Managed to use Marshal.Copy. Not sure how I should
'guess'
the
length
of
the
Byte array to copy to. When I type
FirstBIRSample.BiometricData
(which
is
the IntPtr) in the command window, it returns to me: 2372256 -
is
this
the
size?
I 'assumed' the size would be 1040 (which is stored in
FirstBIRSample.Length).

Second Part: Seems like the FirstBIRSample.Signature (also a
pointer)
is
0,
how should I store this?

Thanks so much!

""Ilya Tumanov [MS]"" <[email protected]>
wrote
in
message
While storing UInt16 as Int is OK, it will take more space.
The
problem
you're having is caused by range check. You might consider
using
unchecked() to disable it.

System.Runtime.InteropServices.Marshal class allows
you
so
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/
use
it. need warranties,
and about
the
 
I

Ilya Tumanov [MS]

You can get data out of SQL CE as Int16 and cast it to UInt16 using
unchecked().
Similarly, cast UInt16 to Int16 to store it.

Another solution would be to declare valuables as signed and let native
code to do interpretation.
That might be problematic if you set values manually somewhere, but it can
be done with unchecked().
Or, you can use equivalent values. For example binary representations of
65535 unsigned and -1 signed for 16 bit values are exactly the same.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.

--------------------
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<[email protected]> <[email protected]>
<[email protected]> <[email protected]>
Subject: Re: To cast or not to cast?
Date: Wed, 13 Apr 2005 02:00:11 +0100
Lines: 686
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!tk2msftngp13.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.framework.compactframework:26864
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

the "unsafe" keyword worked great! vs doesn't complain anymore.

I'm trying to solve the UInt16 problem now. I followed your previous advice
of using unchecked(). It still says that the value is too small or too large
when trying to insert it in the DB using OleDbType.SmallInt (which kind of
makes sense seeing as the value is 53242).

Any other ideas that could help ?

"Ilya Tumanov [MS]" said:
Unsafe block won't eliminate type check (fortunately). You need to do
explicit cast:

SecondBIRSample.BiometricData = (IntPtr32)BiometricDataPtr;

First error means you need to declare this function with unsafe keyword and
use /unsafe compiler switch (can be set in project properties).

public unsafe void DoUnsafeStuff() {
// Can do unsafe stuff here...
..
}

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Tue, 12 Apr 2005 00:36:01 +0100
Lines: 560
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTFEED01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP0
9.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.framework.compactframework:26785
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

I tried to follow you fixed() solution, but I get an error saying that
"Pointers can only be used in an unsafe context" and "Cannot implicitly
convert type void* to System.IntPtr.

I've got the following down. I think the bit I'm missing is the assignment
to IntPtr? And probably the casting as well.. Could you explain though what
the compiler means by the first error? I understand that this is an unsafe
block, so why does it complain?

fixed(void* BiometricDataPtr = (byte[])(bioData[8]))
{
SecondBIRSample.BiometricData = BiometricDataPtr;
}


I can see two reasons:



1. No need to free the memory after call is done.

2. No time wasted making temporary copy of something you already have.



Best regards,



Ilya


This posting is provided "AS IS" with no warranties, and confers no
rights.

Why would one want to use unsafe blocks is beyond me, when it is
so
easy
to call LocalAlloc and Marshal.Copy

--
Alex Feinman
---
Visit http://www.opennetcf.org
It won't, but managed array (retrieved from SQL CE) should be already
allocated.



Best regards,



Ilya



This posting is provided "AS IS" with no warranties, and confers no
rights.


"<ctacke/>" <ctacke_AT_OpenNETCF_com> wrote in message
Though fixed won't allocate any memory for you, so you're still where
you were before.

-Chris


You don't need to do anything to pin memory with fixed(), fixed()
will
do
it for you:

fixed(void *ArrayPointer = MyManagedArray) {
// MyManagedArray is pinned within fixed block and ArrayPointer
points
to
it.
// Assign it to IntPtr (might need some casting) and call native
function
within this block.
}

// MyManagedArray in longer pinned...

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and
confers
http://groups-beta.google.com/group...28847ac90ac8a3/b92cb386364174f7?q=unmanaged+a
llocate+memory&rnum=10#b92cb386364174f7

I supose I could use LocalAlloc to allocate memory. The post seems
to
be
similar to my problem but I still don't understand how to pin
managed
memory
(by using Fixed()?), and have a pointer point to the byte array
(which is
probably what I would want to do) ?

your help is really appreciated!

message
Creating a new pointer is not enough. You need to allocate memory
and
assign value pointing to it to the pointer.
You might allocate native memory via P/Invoke (which you would
have
to
free
at some point).
Or, you can obtain a pointer to a managed array you already have.
Before you pass this pointer to a native code, you have to pin
managed
memory so GC won't move the array.
You can use GCHandle class for it or you can use unsafe code.
I would recommend using Fixed() with unsafe pointer. That would
pin
and
unpin the array automatically.
GCHandle has a bug (returns incorrect pointer - there's a
workaround)
and
it's not automatic.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers
no
rights.

--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 01:46:03 +0100
Lines: 240
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26658
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

Okay, so I used the 1040 length, it doesn't seem to complain,
which is
good
news I guess. To make sure it stores the data correctly I'm
trying
to
retrieve it and feed it back to the biometric template matching
method.

Because it takes IntPtr's for BiometricData and Signature, I
tried
creating
new pointers and marshal copy the content that I retrieved
earlier
into
these pointers. I failed. I tried the following:

System.IntPtr BiometricDataPtr;//create new pointer
BiometricData = (byte[])bioData[8];//BiometricData is an array
of
type
byte
Marshal.Copy(BiometricData, 0, BiometricDataPtr, 1040);//copy
content
of
BiometricData in an IntPtr

"Use of unassigned local variable 'BiometricDataPtr'."
Obvsiously it's unused, it's meant to point to
something...
what
am I
missing here?

message
You should not guess the length, you should know it. It might
be
fixed
or
native code could return it somehow.
Most likely you're correct and FirstBIRSample.Length contains
this
size.
You should check out the documentation for the function you're
calling
to
make sure it's correct.

If value of a pointer is 0, it's null pointer. It means this
pointer
is
not
valid and points to nothing.
Since no data is available, you could store it as DBNull.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and
confers
no
rights.

--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sat, 9 Apr 2005 22:32:29 +0100
Lines: 159
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups:
microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com
84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26653
X-Tomcat-NG:
microsoft.public.dotnet.framework.compactframework

Thanks a lot for that! Before going to the UInt16 problem, I
better
try
to
solve that IntPtr problem.

Managed to use Marshal.Copy. Not sure how I should 'guess'
the
length
of
the
Byte array to copy to. When I type
FirstBIRSample.BiometricData
(which
is
the IntPtr) in the command window, it returns to me:
2372256 -
is
this
the
size?
I 'assumed' the size would be 1040 (which is stored in
FirstBIRSample.Length).

Second Part: Seems like the FirstBIRSample.Signature (also a
pointer)
is
0,
how should I store this?

Thanks so much!

in
message
While storing UInt16 as Int is OK, it will take more
space.
The
problem
you're having is caused by range check. You might consider
using
unchecked() to disable it.

System.Runtime.InteropServices.Marshal class allows
you
to
copy
data
from
the pointer to the array. Look into Copy() methods
of
that
class.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and
confers
no
rights.
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Fri, 8 Apr 2005 10:44:39 +0100
Lines: 91
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID:
Newsgroups:
microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com
84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26572
X-Tomcat-NG:
microsoft.public.dotnet.framework.compactframework

Thanks so much for the replies Alex and Ilya!

I changed the types in sql. It wasn't happy with Uint16
mapped
to
smallint
(sql says value is either too small or too large),
so
I
just
went
for
an
int.

Not sure how to retrieve the data data an IntPtr is
pointing
to
though.
How
can I get that data as a byte array?

thanks so much again!

""Ilya Tumanov [MS]""
wrote
in
message
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/
integers
are
could
only
 
J

Jeremy

can't get it through:/

I ended up trying to store the value as int, which I guess would make sense
because an unsigned value cannot be stored in Sql, and the next thing up I
could find after smallint was int. Please tell me if I'm wrong. It does make
sense to me..

However, casting back to UInt16 really does not work. I'm doing the
following right now :
System.UInt16 formatowner = (System.UInt16)(unchecked((bioData[3])));

I checked the value of bioData[3], it's always 53242:

bioData[3]
{53242}
System.ValueType: {System.Int32}
m_value: 53242
MaxValue: 2147483647
MinValue: -2147483648

I don't even think that I should use the unchecked() statement, I guess it's
just for reassurance. Why would the following raise an invalid cast
exception?

"Ilya Tumanov [MS]" said:
You can get data out of SQL CE as Int16 and cast it to UInt16 using
unchecked().
Similarly, cast UInt16 to Int16 to store it.

Another solution would be to declare valuables as signed and let native
code to do interpretation.
That might be problematic if you set values manually somewhere, but it can
be done with unchecked().
Or, you can use equivalent values. For example binary representations of
65535 unsigned and -1 signed for 16 bit values are exactly the same.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<[email protected]> <[email protected]>
<[email protected]> <[email protected]>
Subject: Re: To cast or not to cast?
Date: Wed, 13 Apr 2005 02:00:11 +0100
Lines: 686
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!tk2msftngp13.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.framework.compactframework:26864
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

the "unsafe" keyword worked great! vs doesn't complain anymore.

I'm trying to solve the UInt16 problem now. I followed your previous advice
of using unchecked(). It still says that the value is too small or too large
when trying to insert it in the DB using OleDbType.SmallInt (which kind of
makes sense seeing as the value is 53242).

Any other ideas that could help ?

"Ilya Tumanov [MS]" said:
Unsafe block won't eliminate type check (fortunately). You need to do
explicit cast:

SecondBIRSample.BiometricData = (IntPtr32)BiometricDataPtr;

First error means you need to declare this function with unsafe
keyword
and
use /unsafe compiler switch (can be set in project properties).

public unsafe void DoUnsafeStuff() {
// Can do unsafe stuff here...
..
}

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers no rights.
--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
<[email protected]> <[email protected]>
Subject: Re: To cast or not to cast?
Date: Tue, 12 Apr 2005 00:36:01 +0100
Lines: 560
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTFEED01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP0
9.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26785
X-Tomcat-NG: microsoft.public.dotnet.framework.compactframework

I tried to follow you fixed() solution, but I get an error saying that
"Pointers can only be used in an unsafe context" and "Cannot implicitly
convert type void* to System.IntPtr.

I've got the following down. I think the bit I'm missing is the assignment
to IntPtr? And probably the casting as well.. Could you explain though
what
the compiler means by the first error? I understand that this is an unsafe
block, so why does it complain?

fixed(void* BiometricDataPtr = (byte[])(bioData[8]))
{
SecondBIRSample.BiometricData = BiometricDataPtr;
}


I can see two reasons:



1. No need to free the memory after call is done.

2. No time wasted making temporary copy of something you already have.



Best regards,



Ilya


This posting is provided "AS IS" with no warranties, and confers no
rights.

Why would one want to use unsafe blocks is beyond me, when it is so
easy
to call LocalAlloc and Marshal.Copy

--
Alex Feinman
---
Visit http://www.opennetcf.org
It won't, but managed array (retrieved from SQL CE) should be already
allocated.



Best regards,



Ilya



This posting is provided "AS IS" with no warranties, and
confers
no confers
http://groups-beta.google.com/group...28847ac90ac8a3/b92cb386364174f7?q=unmanaged+a
llocate+memory&rnum=10#b92cb386364174f7

I supose I could use LocalAlloc to allocate memory. The post seems
to
be
similar to my problem but I still don't understand how to pin
managed
memory
(by using Fixed()?), and have a pointer point to the byte array
(which is
probably what I would want to do) ?

your help is really appreciated!

message
Creating a new pointer is not enough. You need to allocate
memory
and
assign value pointing to it to the pointer.
You might allocate native memory via P/Invoke (which you would
have
to
free
at some point).
Or, you can obtain a pointer to a managed array you already
have.
Before you pass this pointer to a native code, you have to pin
managed
memory so GC won't move the array.
You can use GCHandle class for it or you can use unsafe code.
I would recommend using Fixed() with unsafe pointer. That would
pin
and
unpin the array automatically.
GCHandle has a bug (returns incorrect pointer - there's a
workaround)
and
it's not automatic.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and confers
no
rights.

--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
<[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sun, 10 Apr 2005 01:46:03 +0100
Lines: 240
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <#[email protected]>
Newsgroups: microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com 84.9.101.26
Path:

TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP10.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26658
X-Tomcat-NG:
microsoft.public.dotnet.framework.compactframework

Okay, so I used the 1040 length, it doesn't seem to complain,
which is
good
news I guess. To make sure it stores the data correctly I'm
trying
to
retrieve it and feed it back to the biometric template
matching
method.

Because it takes IntPtr's for BiometricData and Signature, I
tried
creating
new pointers and marshal copy the content that I retrieved
earlier
into
these pointers. I failed. I tried the following:

System.IntPtr BiometricDataPtr;//create new pointer
BiometricData = (byte[])bioData[8];//BiometricData is an array
of
type
byte
Marshal.Copy(BiometricData, 0, BiometricDataPtr, 1040);//copy
content
of
BiometricData in an IntPtr

"Use of unassigned local variable 'BiometricDataPtr'."
Obvsiously it's unused, it's meant to point to something...
what
am I
missing here?

""Ilya Tumanov [MS]"" <[email protected]>
wrote
in
message
You should not guess the length, you should know it. It
might
be
fixed
or
native code could return it somehow.
Most likely you're correct and FirstBIRSample.Length
contains
this
size.
You should check out the documentation for the function
you're
calling
to
make sure it's correct.

If value of a pointer is 0, it's null pointer. It
means
this
pointer
is
not
valid and points to nothing.
Since no data is available, you could store it as DBNull.

Best regards,

Ilya

This posting is provided "AS IS" with no warranties, and
confers
no
rights.

--------------------
From: "Jeremy" <[email protected]>
References: <[email protected]>
<[email protected]>
<#t8wc#[email protected]>
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Sat, 9 Apr 2005 22:32:29 +0100
Lines: 159
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1478
Message-ID: <[email protected]>
Newsgroups:
microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com
84.9.101.26
Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26653
X-Tomcat-NG:
microsoft.public.dotnet.framework.compactframework

Thanks a lot for that! Before going to the UInt16
problem, I
better
try
to
solve that IntPtr problem.

Managed to use Marshal.Copy. Not sure how I should 'guess'
the
length
of
the
Byte array to copy to. When I type
FirstBIRSample.BiometricData
(which
is
the IntPtr) in the command window, it returns to me:
2372256 -
is
this
the
size?
I 'assumed' the size would be 1040 (which is stored in
FirstBIRSample.Length).

Second Part: Seems like the FirstBIRSample.Signature
(also a
pointer)
is
0,
how should I store this?

Thanks so much!

in
message
While storing UInt16 as Int is OK, it will take more
space.
The
problem
you're having is caused by range check. You might
consider
using
unchecked() to disable it.

System.Runtime.InteropServices.Marshal class
allows
you
to
copy
data
from
the pointer to the array. Look into Copy() methods of
that
class.

Best regards,

Ilya

This posting is provided "AS IS" with no
warranties,
and
confers
no
rights.
<[email protected]>
Subject: Re: To cast or not to cast?
Date: Fri, 8 Apr 2005 10:44:39 +0100
Lines: 91
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2800.1478
X-MimeOLE: Produced By Microsoft MimeOLE
V6.00.2800.1478
Message-ID:
Newsgroups:
microsoft.public.dotnet.framework.compactframework
NNTP-Posting-Host: host-84-9-101-26.bulldogdsl.com
84.9.101.26
Path:

TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFTNGP14.phx.gbl
Xref: TK2MSFTNGXA01.phx.gbl
microsoft.public.dotnet.framework.compactframework:26572
X-Tomcat-NG:
microsoft.public.dotnet.framework.compactframework

Thanks so much for the replies Alex and Ilya!

I changed the types in sql. It wasn't happy with
Uint16
mapped
to
smallint
(sql says value is either too small or too
large),
so
I
just
went
for
an
int.

Not sure how to retrieve the data data an IntPtr is
pointing
to
though.
How
can I get that data as a byte array?

thanks so much again!

""Ilya Tumanov [MS]""
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Top