誰か、Windows Embedded Compact 7の開発の方法を教えてください。より正確には、そっちにあるはずのARMターゲットVC++コンパイラの入手方法を教えてください。そっちのほうがコンパイラのバージョンが新しそうですし。
ちなみに、今はこんな風にやっています。まず、次のものをインストールします。
- Windows Phone SDK 7.1 RC
- Visual Studio 2005または2008 Professional以上
- Windows Mobile 6 Professional SDK Refresh
- Windows Mobile 6.5.3 Professional DTK
もしかしたら、Windows Mobile 6.5.3 Professional DTKは要らないのかもしれません(未確認)。ようは、ARMアーキテクチャ向けVC++コンパイラが欲しいわけです。
そこに並べませんでしたが、Visual Studio 2008のSerivce Pack 1などもついでに入れておきましょう。ただし、どうせMicrosoft Updateで入るので、そちらに任せるという手もあります。
あとは、Win32スマートデバイスプロジェクト(Windows Mobile 6.5.3 Professional)を作って、インプロセスなCOMサーバであるコードを書くだけです。それができたら、あとは「Windows Phone 7.5 ネイティブコードプログラミング – ななふぉ」に書いてある手順のとおりに、C#プロジェクト側を書いていけるはずです。以上です。
ネイティブプロジェクト側をもう少し詳しく書きます。あくまで一例なので、ここらへんは好きにやってください。
最初はプロジェクト作成です。Visual Studio 2008でVisual C++のWin32スマートデバイスプロジェクトを作ります。もちろん、ATLやMFCのプロジェクトでも大丈夫と思います。試してみてください。
プラットフォームの設定ではWindows Mobile 6.5.3 Professionalを選びます(おそらくそれ以外でも大丈夫と思います)。アプリケーションの設定では、アプリケーションの種類にDLLを選び追加のオプションはいずれも空(チェックを外せないプリコンパイル済みヘッダのみオン)にします。あとは、完了を押してプロジェクトを作成させます。
そうしたら、stdafx.hの下にヘッダのインクルードを追加します。
1 2 3 4 5 6 7 8 9 10 | // TODO: プログラムに必要な追加ヘッダーをここで参照してください。 #include <cstdarg> //#include <boost/noncopyable.hpp> お好みで #define _ATL_NO_AUTOMATIC_NAMESPACE #define _ATL_NO_HOSTING #include <atlbase.h> #include <atlcom.h> |
cpp側は、こんな感じにコードを書きます。ここでは、IDLを使わずC++上で直接インタフェースやクラスを定義しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #include "stdafx.h" class Native2008aModule : public ATL::CAtlDllModuleT<Native2008aModule> {}; Native2008aModule _AtlModule; BOOL APIENTRY DllMain(HANDLE /*hModule*/, DWORD dwReason, LPVOID lpReserved) { return _AtlModule.DllMain(dwReason, lpReserved); } STDAPI DllCanUnloadNow() { return _AtlModule.DllCanUnloadNow(); } STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { return _AtlModule.DllGetClassObject(rclsid, riid, ppv); } interface __declspec(uuid("95E19FD5-D011-4979-BBFB-26D9C358BDC0")) IDebug : public IUnknown { virtual HRESULT STDMETHODCALLTYPE WriteLine(BSTR s) = 0; virtual HRESULT STDMETHODCALLTYPE WriteLineW(LPCWSTR s) = 0; }; interface __declspec(uuid("4B922F51-4048-4720-B00B-343D1A0A4B00")) IHello : IUnknown { virtual HRESULT STDMETHODCALLTYPE Hello(/*[in]*/ IDebug* debug) = 0; }; class __declspec(uuid("209D662D-F3D1-4590-A33F-7924F39323A1")) ATL_NO_VTABLE HelloImpl : // boost::noncopyable, お好みで public ATL::CComObjectRootEx<ATL::CComMultiThreadModel>, public ATL::CComCoClass<HelloImpl, &__uuidof(HelloImpl)>, public IHello { public: HelloImpl() {} DECLARE_NOT_AGGREGATABLE(HelloImpl) DECLARE_NO_REGISTRY() BEGIN_COM_MAP(HelloImpl) COM_INTERFACE_ENTRY(IHello) END_COM_MAP() HRESULT Hello(IDebug* debug) override { if (debug == NULL) { return E_INVALIDARG; } ATL::CComBSTR str(L"Hello"); debug->WriteLine(str); debug->WriteLineW(L"World"); return S_OK; } }; OBJECT_ENTRY_AUTO(__uuidof(HelloImpl), HelloImpl) |
defファイルもお忘れなく。これが無いことに気付かず、しばらくハマりました。忘れていると、RegisterComDllで0x80070057が返ってきます。
EXPORTS
DllCanUnloadNow PRIVATE
DllGetClassObject PRIVATE
あとはビルドしたら完成です。
ちなみにマネージ側の宣言はこんな感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [ComImport, Guid("95E19FD5-D011-4979-BBFB-26D9C358BDC0"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IDebug { void WriteLine([In, MarshalAs(UnmanagedType.BStr)] string s); void WriteLineW([In, MarshalAs(UnmanagedType.LPWStr)] string s); } [ComImport, Guid("4B922F51-4048-4720-B00B-343D1A0A4B00"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), CoClass(typeof(Hello))] internal interface IHello { void Hello([In] IDebug debug); } [ComImport, Guid("209D662D-F3D1-4590-A33F-7924F39323A1"), ClassInterface(ClassInterfaceType.None)] internal class Hello { } |
なお、IHelloにCoClass属性を付けているので、var obj = new IHello();と書けます。
スポンサード リンク |