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;