アセンブラ入門というサイトがあります。
(COMET IIやGMC-4などではなく)普通のパソコンのアセンブラのリファレンスとして、かなり役立ちます。(個人の感想です)
その中に、
卒業試験という項目がありました。
というわけで、早速挑戦してみたいと思います。
・・・
卒業試験「コンパイラはMicrosoftのVisual C++、Ver6.0です。」
卒業試験「指定のコンパイラが無い場合は 諦めてください。(^_^;)」
は?舐めてんのか?別にコンパイラとか何使ってもいいだろ!わざわざ顔文字まで付けやがって!
早速プロジェクトを開いて、とりあえず一回コンパイルしてみよう!
・・・
\エラー!/
・・・んなばかn・・・な、なんだこれは!
開いたファイルの中には、なんと大量の謎クラスが!
本当に(おそらく)指定のコンパイラが無ければ諦めざるを得ない仕組みが作ってあったのです!
・・・いやまて、謎クラスはあるけど、言語は普通のC++のはずだ。
このクラスを全部実装すればいけるはずだ!
・・・
無 理 だ !
とりあえずコンパイルを通すためにハリボテを作ったのですが、こんな量になってしまいました。
► スポイラーを表示
cwinapp.h
CODE:
#ifndef CWINAPP_H_GUARD
#define CWINAPP_H_GUARD
#include
#define afx_msg
#define DECLARE_MESSAGE_MAP()
#define DECLARE_DYNCREATE(a)
// graph.h
class CMainFrame; // prototype sengen
class CWinApp {
public:
CMainFrame* m_pMainWnd;
int m_nCmdShow;
};
class CString; // prototype sengen
class CDocument {
public:
static BOOL OnNewDocument();
void SetTitle(CString& a);
void sethWnd(HWND a);
};
class CArchive {
public:
BOOL IsStoring();
void Write(const void* a,int b);
void Read(const void* a,int b);
};
class CCmdUI {
public:
void Enable(BOOL a);
};
// ChildFrm.h
class CMDIChildWnd {
public:
BOOL PreCreateWindow(CREATESTRUCT& cs);
void ShowWindow(int a);
void UpdateWindow();
};
#define IMPLEMENT_DYNCREATE(a,b)
#define BEGIN_MESSAGE_MAP(a,b)
#define END_MESSAGE_MAP()
// MainFrm.h
class CStatusBar {
public:
BOOL Create(CMainFrame* a);
BOOL SetIndicators(UINT a[],int b);
void EnableDocking(int a);
};
class CToolBar {
public:
BOOL CreateEx(CMainFrame* a,int b,int c);
BOOL LoadToolBar(int a);
void EnableDocking(int a);
};
class CMDIFrameWnd {
public:
BOOL LoadFrame(int a);
void ShowWindow(int a);
void UpdateWindow();
int OnCreate(LPCREATESTRUCT a);
void EnableDocking(int a);
void DockControlBar(CToolBar* a);
BOOL PreCreateWindow(CREATESTRUCT& a);
};
#define DECLARE_DYNAMIC(a)
// graphView.h
class CGraphDoc; // prototype sengen
class CCreateContext {
};
class CPrintInfo {
};
class CScrollBar {
};
class CDC {
public:
HDC m_hDC;
};
class CWnd {
public:
static BOOL Create(LPCTSTR a,LPCTSTR b,DWORD c,const RECT& d,
CWnd* e,UINT f,CCreateContext* g) {
return FALSE;
}
};
class CView {
public:
CGraphDoc* m_pDocument;
HWND m_hWnd;
void GetClientRect(RECT* a);
BOOL DoPreparePrinting(CPrintInfo* pInfo);
void SetScrollInfo(int a,SCROLLINFO* b,BOOL c);
void InvalidateRect(void* a,BOOL b);
BOOL PreCreateWindow(CREATESTRUCT& a);
};
// graph.cpp
#define ON_COMMAND(a,b)
#define _T(a) a
#define RUNTIME_CLASS(a) NULL
class CMultiDocTemplate {
public:
CMultiDocTemplate();
CMultiDocTemplate(int a,void* b,void* c,void* d);
};
class CCommandLineInfo {
public:
static const int FileOpen=0;
static const int FileNothing=1;
int m_nShellCommand;
};
class CDataExchange {
};
class CDialog {
public:
static const int IDD=0;
CDialog();
CDialog(int a);
static void DoDataExchange(CDataExchange* a);
void DoModal();
};
void AfxEnableControlContainer();
void Enable3dControls();
void Enable3dControlsStatic();
void SetRegistryKey(const char* a);
void LoadStdProfileSettings();
void AddDocTemplate(CMultiDocTemplate* a);
void ParseCommandLine(CCommandLineInfo& a);
BOOL ProcessShellCommand(CCommandLineInfo& a);
// graphDoc.cpp
#define ON_UPDATE_COMMAND_UI(a,b)
class CString {
public:
CString();
CString(const char* a);
void LoadString(int a);
operator char*() const {
return (char*)"";
}
};
//graphView.cpp
#define ON_WM_HSCROLL()
#define ON_WM_VSCROLL()
#define ASSERT_VALID(a)
class AfxGetAppClass {
public:
HCURSOR LoadStandardCursor(LPSTR id);
};
const char* AfxRegisterWndClass(int a,HCURSOR b,void* c);
AfxGetAppClass* AfxGetApp();
//MainFrm.cpp
#define IMPLEMENT_DYNAMIC(a,b)
#define ID_SEPARATOR 1
#define ID_INDICATOR_KANA 2
#define ID_INDICATOR_CAPS 4
#define ID_INDICATOR_NUM 8
#define ID_INDICATOR_SCRL 16
#define ON_WM_CREATE()
#define TBSTYLE_FLAT 0x00000800
#define CBRS_TOP 1
#define CBRS_GRIPPER 2
#define CBRS_TOOLTIPS 4
#define CBRS_FLYBY 8
#define CBRS_SIZE_DYNAMIC 16
#define TRACE0(a)
#define CBRS_ALIGN_ANY 32
typedef unsigned int UINT;
#endif
cwinapp.cpp
CODE:
#include "cwinapp.h"
BOOL CMDIChildWnd::PreCreateWindow(CREATESTRUCT& cs) {
return TRUE;
}
void AfxEnableControlContainer() {
}
void Enable3dControls() {
}
void Enable3dControlsStatic() {
}
void SetRegistryKey(const char* a) {
}
void LoadStdProfileSettings() {
}
void AddDocTemplate(CMultiDocTemplate* a) {
}
BOOL CMDIFrameWnd::LoadFrame(int a) {
}
void ParseCommandLine(CCommandLineInfo& a) {
}
BOOL ProcessShellCommand(CCommandLineInfo& a) {
}
void CMDIChildWnd::ShowWindow(int a) {
}
void CMDIChildWnd::UpdateWindow() {
}
CMultiDocTemplate::CMultiDocTemplate() {
}
CMultiDocTemplate::CMultiDocTemplate(int a,void* b,void* c,void* d) {
}
void CMDIFrameWnd::ShowWindow(int a) {
}
void CMDIFrameWnd::UpdateWindow() {
}
CDialog::CDialog() {
}
CDialog::CDialog(int a) {
}
void CDialog::DoDataExchange(CDataExchange* a) {
}
void CDialog::DoModal() {
}
BOOL CDocument::OnNewDocument() {
return TRUE;
}
BOOL CArchive::IsStoring() {
return TRUE;
}
CString::CString() {
}
CString::CString(const char* a) {
}
void CArchive::Write(const void* a,int b) {
}
void CArchive::Read(const void* a,int b) {
}
void CCmdUI::Enable(BOOL a) {
}
void CDocument::SetTitle(CString& a) {
}
void CString::LoadString(int a) {
}
const char* AfxRegisterWndClass(int a,HCURSOR b,void* c) {
return "";
}
AfxGetAppClass* AfxGetApp() {
return new AfxGetAppClass;
}
HCURSOR AfxGetAppClass::LoadStandardCursor(LPSTR id) {
return (HCURSOR)INVALID_HANDLE_VALUE;
}
void CView::GetClientRect(RECT* a) {
}
BOOL CView::DoPreparePrinting(CPrintInfo* pInfo) {
return FALSE;
}
void CDocument::sethWnd(HWND a) {
}
void CView::SetScrollInfo(int a,SCROLLINFO* b,BOOL c) {
}
void CView::InvalidateRect(void* a,BOOL b) {
}
BOOL CView::PreCreateWindow(CREATESTRUCT& a) {
return FALSE;
}
int CMDIFrameWnd::OnCreate(LPCREATESTRUCT a) {
return -1;
}
BOOL CToolBar::CreateEx(CMainFrame* a,int b,int c) {
return FALSE;
}
BOOL CToolBar::LoadToolBar(int a) {
}
BOOL CStatusBar::Create(CMainFrame* a) {
return FALSE;
}
BOOL CStatusBar::SetIndicators(UINT a[],int b) {
}
void CStatusBar::EnableDocking(int a) {
}
void CMDIFrameWnd::EnableDocking(int a) {
}
void CMDIFrameWnd::DockControlBar(CToolBar* a) {
}
BOOL CMDIFrameWnd::PreCreateWindow(CREATESTRUCT& a) {
return FALSE;
}
void CToolBar::EnableDocking(int a) {
}
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow) {
return 0;
}
cwinapp.cppの最後に注目してください。そう、WinMain関数です。
ダウンロードしたプロジェクトには、なんとWinMain関数が無かったのです!さらに、main関数もありませんでした。
おそらく、本来は謎ライブラリに隠蔽されているのでしょう。それともコンパイルオプションによるエントリーポイント変更でしょうか?
これを全部実装するのは闇であろうことが容易にわかるので、やはり諦めざるを得ないようです。
Visual C++ 6.0のステマですね。害悪です。
とりあえず「
トップ」に戻ってみます。すると、Javaアプレットの実行権限を要求されました。
許可してみると、なんと数種類の文字列が現れたり消えたりするではありませんか!
この程度、GIFアニメでできそうです。それをわざわざ環境によっては対応していないJavaアプレットでやっているのです。
時計もありますが、これもJavaScriptでできそうです。
さらにコンテンツを見ていると、
フリーウェアーというページに
「最近ではJava Appletで遊んでばかりです。」という記述がみつかりました。
そうです!この作者は遊んでいるようです!自己満足のために遊び、ユーザーのことは考えていない
可能性があります!
(作者を叩きすぎてしまったようです。ごめんなさい)
・・・仕方ない。
Amazon.co.jp: Microsoft Visual C++ 6.0 Standard Edition: ソフトウェア
Amazon.co.jp: Microsoft Visual C++ 6.0 Professional Edition アカデミックパック: ソフトウェア
Amazon.co.jp: Microsoft Visual C++ 6.0 Professional Edition: ソフトウェア
Amazon.co.jp: Microsoft Visual C++ 6.0 Enterprise Edition: ソフトウェア
・・・やっぱり受験料10万円は高いな。中古はライセンスが不安だし。
【結論】
GUIから自分で作ろう!
たかがサンプルプログラム(に近いもの)だ!ウィンドウ内でウィンドウを開くとかいう高級な機能はいらない!