Re: Windows Mobile 6, C# and C++
Chris schrieb:
Hello
Strange things happen inside of my own C++ DLL:
My Windows Mobile 6 application is written in C# using the compact framework
3.5. Inside this application I call the following procedure Test() of my own
unmanaged C++ DLL "PPPExtDLL" using DllImport:
[DllImport("PPPExtDLL")]
public static extern void Test();
Inside of Test() I make use of an object of my own C++ class CPGFImage:
void Test() {
HANDLE hFile = CreateFile(_T("test"), GENERIC_READ | GENERIC_WRITE, 0, 0,
CREATE_ALWAYS, FILE_FLAG_RANDOM_ACCESS, 0);
if (hFile && hFile != INVALID_HANDLE_VALUE) {
CPGFFileStream stream(hFile);
CPGFImage image;
...
image.SetHeader(header);
image.Write(&stream);
...
All of this works well on Win32, in case all modules have been compiled for
Win32. Since the target plattform is Windows Mobile 6, it should be also
able to run there. So all modules have been compiled for WM 6 using VS 2008
and .NET compact framework 3.5, but it doesn't work.
What happens on WM 6: image.SetHeader(header) is correctly called and
properly returns, but image.Write(&stream) crashes before it enters into the
method. There is no error message. It doesn't matter what method has been
called before Write, it always crashes when calling Write and before
executing the first instruction of Write. The disassembler shows the
following lines:
void CPGFImage::Write(CPGFStream* stream, int levels /* = 0*/, CallbackPtr
cb /*= NULL*/, UINT32* nWrittenBytes /*= NULL*/) THROW_ {
016B02F8 mov r12, sp
016B02FC stmdb sp!, {r0 - r3}
016B0300 stmdb sp!, {r4, r11, r12, lr}
016B0304 add r11, sp, #0x10
016B0308 ldr r12, [pc, #0x224]
016B030C add sp, sp, r12
The crash always occurs during the last add instruction. These insights are
only possible if a second native debugger is attached to the running smart
device application.
Are there any suggestions or hints I can do to solve these troubles?
I don't speak pocket pc assembler, but do the two commands
016B0308 ldr r12, [pc, #0x224]
016B030C add sp, sp, r12
mean you need a few kb of stack space? A PocketPC is an embedded device, and
usually embedded devices don't have much stack space available. Do you use big
local variables like arrays or big structs? Try to allocate them on the heap, or
use std::string or std::vector instead.
Norbert