誰か、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();と書けます。


スポンサード リンク

この記事のカテゴリ

  • ⇒ C++/CLIが恋しくなってきた
  • ⇒ C++/CLIが恋しくなってきた
  • ⇒ C++/CLIが恋しくなってきた
  • ⇒ C++/CLIが恋しくなってきた