what are these? - XDA Assist

Do these mean anything to anyone...
Shadow-root open
Node Map
Remove/replace child
Remote key identifier

Please share more details, such as the device you use for above.


Need help with code page (ISO 8859-1 Latin I) on WM5

I'm developing a small application in C# for WM5 that connects to a Sybase SQL Anywhere database. I'm doing this for a company and the database is a network database. The connection from my application works just fine, however the db is encoded in ISO 8859-1 Latin I (code page 28591) and whenever I try to connect to it I get an error message telling me:
"The code page (28591) of the database is not installed on the platform."
I can't convert the db to this code page, but HOW can I enable this code page on my WM5 device? I really need this to work =( How do you enable ISO 8859-1 Latin I code page on your WM5 device, I've googled it but it gave me nothing, it's something about using Platform Builder or something?
Anyone can help? I'm kind of desperate and will giving money away to the one who can help me =)
Thanks in advance
isn't there anyone who can put me in the right direction or help me?

Switch for cprog.exe

Does anyone know the switch for cprog.exe to get to the "Call History" or "Speed Dial" screen directly without having to start the dialer first?
Or can anyone help me reverse engineer the cprog.exe to find this switch?
To open the call log directly use the code
To open the speed dial change the ID value 0x00002712 to that of the speed dial (I dont now it right now, but it is easy to find it)
Enjoy :twisted:
Thanks very much mmalek!!!
It works fine under 2003 (SE) but unfortunately it doesn't work under WM 5.0 (Magneto). Does your code only work for the 2003 platform?
Thanks again!
For WM5, you have to find out correct resource IDs.
For cprog.exe, open tapres.dll in some resource editor and lookup IDs there.
How do you find out the correct ressource ID? When I open the tapres.dll of WM2003 and try to find the resource ID 0x00002712 mmalek used in his code, I can find it nowhere...
I open the DLL with PE Explorer... where exactly do I have to look for these ID's?
Thanks a lot guys!
#buzz_lightyear: Are you sure the correct resource IDs are inside tapres.dll? I dont know much about Windows programming and please correct me if I am wrong, but from my understanding inside tapres.dll are only the resource ID's of the "Menu" and not of the "Buttons" of the Dialer.
Please could anyone give me a hint to find a solution? I really need this!
Hi, the IDs are in the tapres.dll, but this is not what I used.
The ID for the "Call History" button is 22303 or 571F Hex so you can also use this to send the WM_COMMAND massage. What I used to get the ID is the RemoteSpy++ i just spied on the cprog.exe messages and then clicked the button I need then the resource id is in the wParam of the message. you should succed using either method...
Enjoy ---- :twisted:
Thanks a lot mmalek for your hint! But I am really wondering how you managed to make RemoteSpy++ work with a Magneto device! If I try to use RemoteSpy++ from EVC++ 4.0 I get always an error message. Unfortunately the RemoteSpy tool from Visual Studio 2005 Beta2 has still a bug and does not work either. So I have still no idea how to get the right Resource ID's to start directly the "Call History" and "Speed dial" screen.
(0x0000571F does not work on my Magneto devices (Wizard & WM5 2020))
So if anyone could provide me with the right Resource ID's for the "Call History" and "Speed dial" button for Magneto devices I would REALLY appreciate if he would post them
how to use this code?
Sorry to resurrect this thread, but did anyone get anywhere with this for WM5 / WM6? It would be *really* handy for today screen apps such as XMT or rlToday to be able to have a button that takes you to missed calls, and for this we need a command line switch for cprog or a .exe - we cannot put raw C in XMT / rlToday themes...
This would rock as an exe, especially if it worked for 2003, WM5 and WM6 - any takers?
You can use these .exe helpers:
Windows Mobile Phone edition based, are opensource GPL so you can use, and distribuite as you want.
These utilities can be found on the \Tools folder of XIAMultitheme binaries, or sources too
You can download XMT (Always download Snapshots!) from here:
Download XMT Binaries

SQL CE 3.5 - First App

I'm working on developing my first WM 6 App using SQL CE 3.5 . I'm sure there are other apps out there that do what mine does, but I'm just wanting the experience of developing it.
I'm working on a fairly simple app to track gas mileage and such. But, for some reason, whenever I debug it, the app can't seem to find the database file. I get an error saying: "The database file cannot be found. Check the path to the database. [ Data Source = .\GasTrackerDB.sdf ]"
I can browse with file explorer on the device and find the database in the same directory as the deployed application, so I'm not really sure where to go from here..
I'm doing everything through the IDE, so all of the code is generated for me to connect to the database.
Anybody experienced enough to help me troubleshoot this stupid problem?
i have been looking for an app that does the same thing as the one you are working on.
when it is finished please pm me. i wish i knew more programing, if i did i would help you.
I did figure it out after messing around with it. I think it has to do with the way VS2008 deploys the app on the emulator...
When I hard-code the path to the database file, it works. So, my app will just have to be installed on the local device and not the SD card
Don't hard-code the path! The method GetApplicationPath() returns the application path. This is also important when installing on OS with different language.
How is that possible when the Connection String was generated by the IDE? Here's what the .xsd says:
On application start create the connection string "Data Source = " + database (like post #3)
This connection string can then be passed wherever you need to connect to the database.
That's the problem.. the IDE created all the stuff for the connection string and I don't know enough about it to create everything needed manually.
How do you connect to the db? What are you calling for retrieving data from db? How do you insert data to the db? All these actions need an object which somehow knows the connectionstring. And this string can/must be changed.
Hmm.. That doesn't seem to be a valid function name. I'm using .NET CF 3.5 .I'll keep looking.
Well, I wrote my own function to get the execution path, but I still can't figure out how to modify the connection string at runtime.
This crap is ridiculous. I don't understand why it doesn't "just work" when I let the IDE do everything...

Get notified when process is started

I want to know if there is a way to get notified from windows pocket pc
system when a process is started or a new window is created.
Is there an API call that will manage this?
The only thing available is using the toolhelp library, by getting the current process list and update it, you can determine if a process started or stopped.
For the windows, it's the same, there isn't any notification mechanism to do that.
On the BB Windows, you can install a system-wide hook and catch WM_CREATE notifications. Probably there is something similar for Mobile...
In coredll.dll, the SetWindowsHookEx function is defined but is undocumented. Maybe the declaration is the same that the one under Windows, you can have try.
I found in PB5 header pwinuser.h the following declarations:
The idHook you're interested in is WH_CBT and it seems to work in WINCE5.
Hey that sounds good. Thanks so far.
I will try this now with SetWindowsHookExW().
Currently I am polling the process list with toolhelp library.
But this is not so good for performance and battery.
So I have tried this and have written a Dll where I hook
the WH_CBT with SetWindowsHookExW.
I have loaded the function pointers from the coredll.dll with LoadLibrary()
which is ok. But when I call SetWindowsHookExW() in my hook Dll
theh I get always error 87 back.
This is my code in the hook dll to install the hook.
Any ideas what is wrong here?
87 means invalid parameter:
I think I know why!
Here read this:
[in] Handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process.
[in] Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads running in the same desktop as the calling thread.
So I would change your call by this one:
I have tries both suggestions from you, but always error 87.
Have tried this in a dll and in an exe but same error.
Here is my callback function code:
Why are you exporting the CALLBACK function ?
Thanks for your quick answers.
Hmm I have seen this in a desktop sample hook dll project
and have copied this.
Tried the dll without exporting the callback function but same error.
I am really confused what param is invalid.
Have defined this in my dll:
I think this is correct.
Have you ever calles SetWindowsHookExW() successfully on pocket pc?

RAPI problem writing registry key value

I am presently writing a RegEdit program to run on my PC and allow editing of the registry on the connected PPC. I have got to the point where I can read the entire registry and I am now implementing function to update the registry i.e. insert new key, delete key, add new Key Values etc...
The problem I have at the moment is trying to add a new value to an existing key. The function I have written so far to do this is as follows, but the call to CeRegSetValueEx(...) returns an error code 5!
I would appreciate a little advise on the matter, as this is the first time I have used the RAPI.
Hi VZ800!
The error you're getting is 'access denied'. In WM5 many RAPI functions (including writing to registry) are blocked for security reasons. Your only choice is to use a dll with CeRapiInvoke functions, but it needs to be deployed through a special cab.
You can read about this on msdn.
By the way, the app you're writing already exists, and it has the same problem.
Good luck!
Thanks for the advice. Since my post I have found that my code works for the HKEY_LOCAL_MACHINE, "/Software".
I will investigate the issue you have pointed me to.
Actually, your code should work for the entire HKEY_CLASSES_ROOT as well. MS decided to block only certain 'sensitive' parts of the registry so they can not be corrupted from the outside by malicious software.
If you noticed, MS's own remote registry editor works through DLLs (a ton of them).
Any way, I skimped on words in my first post, since I was writing it on a bus, and while I love my Jamin, writing long text on it is not very enjoyable.
Let me elaborate on CeRapiInvoke:
It's a function you call on the PC side that receives a DLL name and a function name (in that DLL) as parameters and calls that function on the device. It also lets you transfer buffers of data to and from the called function.
It's a great way to communicate with a PPC device without using sockets. You can write the device side DLL to do what ever you wont (like access protected registry) and report back to the PC.
The only drawback is in WM5 this DLL has to be registered and have a 'system' file attribute set. That's why you have to deploy it by cab.
Like I said before it's all in the MSDN.
Hope this helps.
Thanks. I have read the articles (and printed them) about RAPI Restricted Mode Security etc... http://msdn.microsoft.com/library/de...deSecurity.asp and will write a DLL to go on the PPC which will be installed via CAB etc...
I updated the function to add a new value anyway. Rather than calling the RAPI functions for the registry CeRapi... I will call my own functions in my authorised DLL.
A question on using the CeRapiInvoke function. Obviously my function that I will be invoking in my DLL will need to conform to the following footprint:
What I would like to know is this: If I want my function to be a wrapper to say the
function, how do I parse the function args? Please suggest how I would pack them into a BYTE* for the pInput parameter.
Actually, you got it a bit wrong:
The prototype you specified is for the PC side (the first two strings are DLL name and function name);
I use the following parsing method:
It works fine both ways.
Just don't forget to use LocalAlloc for inBuffer and LocalFree for outBuffer.
Thanks. I'll let you know how I get on.
So if I were to parse an HKEY and an LPTSTR accross I would do the following to put the data into a BYTE array:
Basically, yes but with two reservations:
1) I recommend using a different pointer for the current position in buffer, to avoid errors.
2) you need to put the string length in the byte array before the string, otherwise you won't know it's length on the device side. Alternatively, you have to add 1 to the length so the 0 byte at the end gets packed and you can use strlen on the device.
Also keep in mined that unless you define the PC side project to work with UNICODE libraries, THCHAR will be defined as char, while on the device it's always WCHAR.
I really apreciate your help. I still can't get my DLL function to work I keep getting error 1064!
This is my code for the DLL named REditSvr.dll:
and this is the code in my PC application which invokes the above function (or I would hope it did):
The DLL has been deployed to the PPC \Windows folder by eVC4. My PPC runs WM5 (is this the problem, although I have written programs with eVC4 ok for it).
I would again appreciate your help/advice on why this isn't working. At present I have unlocked my PPC and I am able to edit any part of the registry etc...