Release ea2xmi-0.0.3
@@ -0,0 +1,196 @@ | ||
1 | +#include "StdAfx.h" | |
2 | +#include "EaConnect.h" | |
3 | + | |
4 | +using namespace EA2XMI; | |
5 | + | |
6 | +BSTR EaConnect::GetFirstPackageName(LPCTSTR packageTree) { | |
7 | + UINT fulllen = _tcslen(packageTree); | |
8 | + LPCTSTR child = _tcschr(packageTree, _T('/')); | |
9 | + LPTSTR first; | |
10 | + if (child) { | |
11 | + UINT childlen = _tcslen(child); | |
12 | + | |
13 | + first = new _TCHAR[fulllen - childlen + 1]; | |
14 | + _tcsncpy_s(first, fulllen - childlen + 1, packageTree, fulllen - childlen); | |
15 | + } else { | |
16 | + first = new _TCHAR[fulllen + 1]; | |
17 | + _tcscpy_s(first, fulllen + 1, packageTree); | |
18 | + } | |
19 | +#ifdef _DEBUG | |
20 | + _tprintf_s(_T("in->%s, out->%s\n"), packageTree, first); | |
21 | +#endif | |
22 | + BSTR rtn = SysAllocString(first); | |
23 | + delete first; | |
24 | + return rtn; | |
25 | +} | |
26 | + | |
27 | +void EaConnect::ShowErrorMessage(HRESULT hr, DWORD dwMessageId) { | |
28 | + LPVOID lpMsgBuf = NULL; | |
29 | + LPVOID lpComMsgBuf = NULL; | |
30 | + if (dwMessageId) { | |
31 | + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | |
32 | + , NULL, dwMessageId, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL); | |
33 | + } | |
34 | + if (FAILED(hr)) { | |
35 | + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | |
36 | + , NULL, hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpComMsgBuf, 0, NULL); | |
37 | + } | |
38 | + | |
39 | + _tprintf_s(_T("COM Error: %#x %sWin Error: %d %s\n"), hr, lpComMsgBuf, dwMessageId, lpMsgBuf); | |
40 | + LocalFree(lpMsgBuf); | |
41 | + LocalFree(lpComMsgBuf); | |
42 | +} | |
43 | + | |
44 | +EaConnect::EaConnect(void) | |
45 | +{ | |
46 | +} | |
47 | + | |
48 | + | |
49 | +EaConnect::~EaConnect(void) | |
50 | +{ | |
51 | +} | |
52 | + | |
53 | +HRESULT EaConnect::Open(LPCTSTR eap) { | |
54 | + HRESULT hr = E_FAIL; | |
55 | + | |
56 | + if (FAILED(hr = CoCreateInstance(CLSID_Repository, NULL, CLSCTX_LOCAL_SERVER, IID_IDualRepository, (LPVOID *) &_pRepo))) { | |
57 | + ShowErrorMessage(hr, GetLastError()); | |
58 | + return hr; | |
59 | + } | |
60 | + | |
61 | + BSTR filepath = SysAllocString(eap); | |
62 | + VARIANT_BOOL pRet = FALSE; | |
63 | + if (FAILED(hr = _pRepo->OpenFile(filepath, &pRet))) { | |
64 | + ShowErrorMessage(hr, GetLastError()); | |
65 | + } | |
66 | + SysFreeString(filepath); | |
67 | + return hr; | |
68 | +} | |
69 | + | |
70 | +HRESULT EaConnect::Close(void) { | |
71 | + HRESULT hr = S_OK; | |
72 | + if (_pRepo) { | |
73 | + _pRepo->CloseFile(); | |
74 | + hr = _pRepo->Exit(); | |
75 | + } | |
76 | + return hr; | |
77 | +} | |
78 | + | |
79 | +HRESULT EaConnect::ExportXML(LPCTSTR package, LPCTSTR output) { | |
80 | + HRESULT hr = S_OK; | |
81 | + | |
82 | + BSTR guid; | |
83 | + if (FAILED(hr = GetGUIDOfPackage(package, &guid))) { | |
84 | + return hr; | |
85 | + } | |
86 | + | |
87 | + IDualProject *pProj; | |
88 | + if (FAILED(hr = _pRepo->GetProjectInterface(&pProj))) { | |
89 | + ShowErrorMessage(hr, GetLastError()); | |
90 | + SysFreeString(guid); | |
91 | + return hr; | |
92 | + } | |
93 | + | |
94 | + BSTR xmlGUID; | |
95 | + pProj->GUIDtoXML(guid, &xmlGUID); | |
96 | + SysFreeString(guid); | |
97 | + | |
98 | + BSTR outputFile = SysAllocString(output); | |
99 | + BSTR pRet = NULL; | |
100 | + if (FAILED(hr = pProj->ExportPackageXMI(xmlGUID, xmiEADefault, 0, -1, 1, 1, outputFile, &pRet))) { | |
101 | + ShowErrorMessage(hr, GetLastError()); | |
102 | + } | |
103 | + _tprintf_s(_T("%s\n"), pRet); | |
104 | + SysFreeString(xmlGUID); | |
105 | + SysFreeString(outputFile); | |
106 | + SysFreeString(pRet); | |
107 | + pProj->Release(); | |
108 | + return hr; | |
109 | +} | |
110 | + | |
111 | +HRESULT EaConnect::GetGUIDOfPackage(LPCTSTR package, BSTR* guid) { | |
112 | + HRESULT hr = S_OK; | |
113 | + BSTR e = NULL; | |
114 | + IDualCollection* pPackages; | |
115 | + | |
116 | + if (FAILED(hr = _pRepo->get_Models(&pPackages))) { | |
117 | + ShowErrorMessage(hr, GetLastError()); | |
118 | + return hr; | |
119 | + } | |
120 | + | |
121 | + short count = 0; | |
122 | + if (FAILED(hr = pPackages->get_Count(&count))) { | |
123 | + ShowErrorMessage(hr, GetLastError()); | |
124 | + return hr; | |
125 | + } | |
126 | + | |
127 | + IDualPackage *pTarget = NULL; | |
128 | + for (int i = 0; i < count; i++) { | |
129 | + IDispatch *pRet; | |
130 | + if (FAILED(hr = pPackages->GetAt(i, &pRet))) { | |
131 | + ShowErrorMessage(hr, GetLastError()); | |
132 | + return hr; | |
133 | + } | |
134 | + IDualPackage *pPackage; | |
135 | + if (FAILED(hr = pRet->QueryInterface(IID_IDualPackage, (void **) &pPackage))) { | |
136 | + ShowErrorMessage(hr, GetLastError()); | |
137 | + | |
138 | + pRet->Release(); | |
139 | + return hr; | |
140 | + } | |
141 | + pRet->Release(); | |
142 | + | |
143 | + if (FAILED(hr = SearchPackage(pPackage, package, &pTarget))) { | |
144 | + _tprintf_s(_T("パッケージが見つかりません:%s (ErrorCode %#x)\n"), package, hr); | |
145 | + | |
146 | + pPackage->Release(); | |
147 | + return hr; | |
148 | + } | |
149 | + pPackage->Release(); | |
150 | + | |
151 | + if (pTarget) break; | |
152 | + } | |
153 | + | |
154 | + if (pTarget) { | |
155 | + if (FAILED(hr = pTarget->get_PackageGUID(guid))) { | |
156 | + ShowErrorMessage(hr, GetLastError()); | |
157 | + } | |
158 | + pTarget->Release(); | |
159 | + } | |
160 | + return hr; | |
161 | +} | |
162 | + | |
163 | +HRESULT EaConnect::SearchPackage(IDualPackage* pPackage, LPCTSTR searchPath, IDualPackage** target) { | |
164 | + HRESULT hr = S_OK; | |
165 | + IDualCollection* pPackages; | |
166 | + if (FAILED(hr = pPackage->get_Packages(&pPackages))) { | |
167 | + return hr; | |
168 | + } | |
169 | + | |
170 | + BSTR name = GetFirstPackageName(searchPath); | |
171 | + IDispatch *pRet; | |
172 | + if (FAILED(hr = pPackages->GetByName(name, &pRet))) { | |
173 | + SysFreeString(name); | |
174 | + pPackages->Release(); | |
175 | + return hr; | |
176 | + } | |
177 | + SysFreeString(name); | |
178 | + | |
179 | + IDualPackage *pChild; | |
180 | + if (FAILED(hr = pRet->QueryInterface(IID_IDualPackage, (void **) &pChild))) { | |
181 | + ShowErrorMessage(hr, GetLastError()); | |
182 | + | |
183 | + pPackage->Release(); | |
184 | + pRet->Release(); | |
185 | + return hr; | |
186 | + } | |
187 | + | |
188 | + // searchPathに子階層が残っていたら再帰する | |
189 | + LPCTSTR child = _tcschr(searchPath, '/'); | |
190 | + if (child) { | |
191 | + return SearchPackage(pChild, child + 1, target); | |
192 | + } else { | |
193 | + *target = pChild; | |
194 | + return hr; | |
195 | + } | |
196 | +} |
@@ -0,0 +1,24 @@ | ||
1 | +#pragma once | |
2 | + | |
3 | +#import "C:\Program Files\SparxSystems Japan\EA\EA.tlb" no_namespace named_guids raw_interfaces_only | |
4 | + | |
5 | +namespace EA2XMI { | |
6 | + class EaConnect { | |
7 | + private: | |
8 | + IDualRepositoryPtr _pRepo; | |
9 | + BSTR GetFirstPackageName(LPCTSTR package); | |
10 | + void ShowErrorMessage(HRESULT hr, DWORD dwMessageId); | |
11 | + | |
12 | + public: | |
13 | + EaConnect(void); | |
14 | + ~EaConnect(void); | |
15 | + | |
16 | + HRESULT Open(LPCTSTR eap); | |
17 | + HRESULT Close(); | |
18 | + | |
19 | + HRESULT ExportXML(LPCTSTR package, LPCTSTR output); | |
20 | + HRESULT GetGUIDOfPackage(LPCTSTR package, BSTR* guid); | |
21 | + HRESULT SearchPackage(IDualPackage *package, LPCTSTR searchPath, IDualPackage **target); | |
22 | + }; | |
23 | + | |
24 | +} |
@@ -0,0 +1,17 @@ | ||
1 | +// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または | |
2 | +// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル | |
3 | +// を記述します。 | |
4 | +// | |
5 | + | |
6 | +#pragma once | |
7 | + | |
8 | +#include "targetver.h" | |
9 | + | |
10 | +#include <stdio.h> | |
11 | +#include <tchar.h> | |
12 | + | |
13 | + | |
14 | + | |
15 | +// TODO: プログラムに必要な追加ヘッダーをここで参照してください。 | |
16 | +#include <Windows.h> | |
17 | +#include <locale.h> |
@@ -0,0 +1,51 @@ | ||
1 | +// ea2xmi.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 | |
2 | +// | |
3 | + | |
4 | +#include "stdafx.h" | |
5 | +#include "EaConnect.h" | |
6 | + | |
7 | +using namespace EA2XMI; | |
8 | + | |
9 | +void PrintUsage() { | |
10 | + _tprintf(_T("Usage: EaWin32.exe [in.eap] [SearchPath] [out.xml]\n")); | |
11 | +} | |
12 | + | |
13 | +BOOL CheckArg(int argc, _TCHAR* argv[], LPTSTR* in, LPTSTR *searchPath, LPTSTR* out) { | |
14 | + if (argc <= 3) { | |
15 | + PrintUsage(); | |
16 | + return FALSE; | |
17 | + } | |
18 | + *in = argv[1]; | |
19 | + *searchPath = argv[2]; | |
20 | + *out = argv[3]; | |
21 | + return TRUE; | |
22 | +} | |
23 | + | |
24 | +int _tmain(int argc, _TCHAR* argv[]) | |
25 | +{ | |
26 | + _tsetlocale(LC_ALL, _T("")); | |
27 | + | |
28 | + LPTSTR in, searchPath, out; | |
29 | + if (!CheckArg(argc, argv, &in, &searchPath, &out)) { | |
30 | + return 1; | |
31 | + } | |
32 | + | |
33 | + ::CoInitialize(NULL); | |
34 | + | |
35 | + HRESULT hr = FALSE; | |
36 | + EaConnect* con = new EaConnect(); | |
37 | + if (SUCCEEDED(hr = con->Open(in))) { | |
38 | + if (FAILED(hr = con->ExportXML(searchPath, out))) { | |
39 | + _tprintf_s(_T("XMIファイルの出力が失敗しました ErrorCode:%#x\n"), hr); | |
40 | + } else { | |
41 | + _tprintf_s(_T("XMIファイルを出力しました[%s]\n"), out); | |
42 | + } | |
43 | + con->Close(); | |
44 | + } | |
45 | + delete con; | |
46 | + con = NULL; | |
47 | + | |
48 | + CoUninitialize(); | |
49 | + | |
50 | + return 0; | |
51 | +} |
@@ -0,0 +1,8 @@ | ||
1 | +#pragma once | |
2 | + | |
3 | +// SDKDDKVer.h をインクルードすると、利用できる最も上位の Windows プラットフォームが定義されます。 | |
4 | + | |
5 | +// 以前の Windows プラットフォーム用にアプリケーションをビルドする場合は、WinSDKVer.h をインクルードし、 | |
6 | +// SDKDDKVer.h をインクルードする前に、サポート対象とするプラットフォームを示すように _WIN32_WINNT マクロを設定します。 | |
7 | + | |
8 | +#include <SDKDDKVer.h> |
@@ -0,0 +1,8 @@ | ||
1 | +// stdafx.cpp : 標準インクルード ea2xmi.pch のみを | |
2 | +// 含むソース ファイルは、プリコンパイル済みヘッダーになります。 | |
3 | +// stdafx.obj にはプリコンパイル済み型情報が含まれます。 | |
4 | + | |
5 | +#include "stdafx.h" | |
6 | + | |
7 | +// TODO: このファイルではなく、STDAFX.H で必要な | |
8 | +// 追加ヘッダーを参照してください。 |
@@ -0,0 +1,45 @@ | ||
1 | +======================================================================== | |
2 | + コンソール アプリケーション: ea2xmi プロジェクトの概要 | |
3 | +======================================================================== | |
4 | + | |
5 | +この ea2xmi アプリケーションは、AppWizard により作成されました。 | |
6 | + | |
7 | +このファイルには、ea2xmi | |
8 | +アプリケーションを構成する各ファイルの内容の概要が含まれています。 | |
9 | + | |
10 | + | |
11 | +ea2xmi.vcxproj | |
12 | + これは、アプリケーション ウィザードを使用して生成された VC++ | |
13 | + プロジェクトのメイン プロジェクト ファイルです。 | |
14 | + ファイルを生成した Visual C++ のバージョンに関する情報と、アプリケーション | |
15 | + ウィザードで選択されたプラットフォーム、 | |
16 | + 構成、およびプロジェクト機能に関する情報が含まれています。 | |
17 | + | |
18 | +ea2xmi.vcxproj.filters | |
19 | + これは、アプリケーション ウィザードで生成された VC++ プロジェクトのフィルター | |
20 | + ファイルです。 | |
21 | + このファイルには、プロジェクト内のファイルとフィルターとの間の関連付けに関する | |
22 | + 情報が含まれています。 この関連付けは、特定のノー | |
23 | + ドで同様の拡張子を持つファイルのグループ化を | |
24 | + 示すために IDE で使用されます (たとえば、".cpp" ファイルは "ソース ファイル" | |
25 | + フィルターに関連付けられています)。 | |
26 | + | |
27 | +ea2xmi.cpp | |
28 | + これは、メインのアプリケーション ソース ファイルです。 | |
29 | + | |
30 | +///////////////////////////////////////////////////////////////////////////// | |
31 | +その他の標準ファイル : | |
32 | + | |
33 | +StdAfx.h、StdAfx.cpp | |
34 | + これらのファイルは、ea2xmi.pch | |
35 | + という名前のプリコンパイル済みヘッダー (PCH) ファイルと、StdAfx.obj | |
36 | + という名前のプリコンパイル済みの型ファイルを構築するために使用されます。 | |
37 | + | |
38 | +///////////////////////////////////////////////////////////////////////////// | |
39 | +その他のメモ : | |
40 | + | |
41 | +AppWizard では "TODO:" | |
42 | +コメントを使用して、ユーザーが追加またはカスタマイズする必要のあるソース | |
43 | +コードを示します。 | |
44 | + | |
45 | +///////////////////////////////////////////////////////////////////////////// |