Skip to content

Instantly share code, notes, and snippets.

@bg1bgst333
Created September 17, 2024 05:50
Show Gist options
  • Save bg1bgst333/38766c253b3249e3f506bc67c89b5792 to your computer and use it in GitHub Desktop.
Save bg1bgst333/38766c253b3249e3f506bc67c89b5792 to your computer and use it in GitHub Desktop.
Application#Excel::Visible#put
// ヘッダのインクルード
// 既定のヘッダ
#include <windows.h> // 標準WindowsAPI
#include <tchar.h> // TCHAR対応
// 独自のヘッダ
#include "Application.h" // Word::CApplication
// コンストラクタCApplication
Excel::CApplication::CApplication() {
}
// staticな生成関数CreateInstance.
Excel::CApplication * Excel::CApplication::CreateInstance() {
// 変数の宣言と初期化.
CLSID clsid; // CLSIDを格納するclsid.
IDispatch * pDispatch = NULL; // IDispatchポインタpDispatchをNULLで初期化.
// "Excel.Application"のCLSIDの取得.
HRESULT hr = CLSIDFromProgID(_T("Excel.Application"), &clsid); // CLSIDFromProgIDで"Excel.Application"のclsidを取得.
if (FAILED(hr)) { // 失敗.
return NULL;
}
// IDispatchポインタpDispatchの取得.
hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&pDispatch)); // CoCreateInstanceで, pDispatchを生成.
if (FAILED(hr)) { // 失敗.
return NULL;
}
// 成功.
CApplication *pApplication = new CApplication();
pApplication->m_pDispatch = pDispatch;
return pApplication;
}
// デストラクタ~CApplication
Excel::CApplication::~CApplication() {
// m_pDispatchの解放.
if (m_pDispatch != NULL) { // m_pDispatchがNULLでなければ.
m_pDispatch->Release(); // IDispatch::Releaseで解放.
m_pDispatch = NULL; // NULLをセット.
}
}
// 表示・非表示プロパティ.
BOOL Excel::CApplication::put_Visible(BOOL bVisible) {
// メソッドやプロパティのDISPIDの取得.
LPOLESTR lpwszName = L"Visible"; // lpwszNameを"Visible"で初期化.
DISPID dispid; // DISPID型dispid.
HRESULT hr = m_pDispatch->GetIDsOfNames(IID_NULL, &lpwszName, 1, LOCALE_USER_DEFAULT, &dispid); // IDispatch::GetIDsOfNamesでdispid取得.
if (FAILED(hr)) { // 失敗.
return FALSE;
}
// メソッドやプロパティにアクセス.
VARIANT var; // VARIANT構造体var.
DISPPARAMS dispparams; // DISPPARAMS構造体dispparams.
DISPID dispidname = DISPID_PROPERTYPUT; // dispidnameをDISPID_PROPERTYPUTに初期化.
var.vt = VT_I4; // 4バイトint.
if (bVisible) { // TRUEなら.
var.lVal = 1; // 値は1.
}
else {
var.lVal = 0; // 値は0.
}
dispparams.cArgs = 1; // 引数の数は1.
dispparams.rgvarg = &var; // &varを指定.
dispparams.rgdispidNamedArgs = &dispidname; // &dispidnameを指定.
dispparams.cNamedArgs = 1; // cNamedArgsも1.
hr = m_pDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, NULL); // IDispatch::Invokeでアクセス.
if (FAILED(hr)) { // 失敗.
return FALSE;
}
// 成功.
return TRUE;
}
// 二重インクルード防止
#ifndef __EXCEL__APPLICATION_H__
#define __EXCEL__APPLICATION_H__
// 名前空間Excelの定義
namespace Excel {
// アプリケーションクラスCApplicationの定義
class CApplication {
// privateメンバ
private:
// privateメンバ変数
IDispatch *m_pDispatch; // IDispatchポインタm_pDispatch.
// privateメンバ関数
// コンストラクタ
CApplication(); // コンストラクタCApplication(newで生成不可.)
// publicメンバ
public:
// publicメンバ関数
// staticメンバ関数
static CApplication * CreateInstance(); // staticな生成関数CreateInstance.
// デストラクタ
virtual ~CApplication(); // デストラクタ~CApplication
// メンバ関数
BOOL put_Visible(BOOL bVisible); // 表示・非表示プロパティ.
};
}
#endif
// ヘッダファイルのインクルード
// 既定のヘッダ
#include <windows.h> // 標準WindowsAPI
#include <tchar.h> // TCHAR対応
// 独自のヘッダ
#include "Excel/Application.h" // Excel::CApplication
// _tmain関数の定義
int _tmain(int argc, TCHAR *argv[]) { // main関数のTCHAR版.
// COMの初期化.
CoInitialize(NULL); // CoInitializeでCOMを初期化.
// Excel::CApplicationの生成
Excel::CApplication *pApplication = Excel::CApplication::CreateInstance(); // Excel::CApplication::CreateInstanceで作成.
// 取得したpApplicationを出力.
_tprintf(_T("pApplication = 0x%08x\n"), (unsigned long)pApplication); // pApplicationを出力.
// アプリケーションの表示.
pApplication->put_Visible(TRUE); // Excel::CApplication::put_VisibleにTRUE渡して表示.
// pApplicationの破棄.
if (pApplication != NULL) {
delete pApplication;
}
// COMの終了処理.
CoUninitialize(); // CoUninitializeで終了処理.
// プログラムの終了.
return 0; // 0を返して終了.
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment