こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

既存アプリを利用したプログラミング

他の方が作成されたアプリを使ってプログラムを作成したいのですが、どのようにしたらよいのでしょうか。
ご教示お願いいたします。

開発環境はOS:Windows Vista Business 開発言語:Microsoft Visual sutudio2005 C++ です。

手元にあるのはWindows インストーラ パッケージ(.msi)でインストールするとexeファイル・OCXファイル・XPRファイル・DLLファイル・だろ\\DATファイルがC\:program file\内に作成されます。

このアプリはある試験片のひずみデータをX線発生装置で計測し、出力されたテキストファイルデータをファイルを指定して読み込み計算して結果(強度や半値幅等)をExcel形式の表で表示するとものです。

私がやろうとしていることは現在毎度ファイルを指定してデータを読み込んでいるのをフォルダをしてファルダ内のファイルをすべて読み込ませるようし、Excel形式の表からデータを抜き出しどんな形式でもいいから結果データを保存できるような仕組みにしたいのです。

大変読みにくくて申し訳ないのですが、
全くどうしたらいいのかわからないのでご教示お願いいたします。

投稿日時 - 2009-08-19 11:46:09

QNo.5219213

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

 こんばんは。
 
 Excelのセルからデータを取って来たいと言う事でしょうか。
 もしそうであるならば、以下が参考になると思います。

 http://www.ujasiri.com/prglib/vc/excel/vc_excel.html
 http://www-online.kek.jp/~keibun/pukiwiki/index.php?C%2B%2B%A4%CB%A4%AA%A4%B1%A4%EBExcel%A4%CE%CD%F8%CD%D1
 http://hp.vector.co.jp/authors/VA014436/prg_memo/database/ms/009.html

 例えば、Office2003がインストールされている場合は以下の様に成ります(2つ目のURLにOfficeのバージョン別設定が書かれています)。以下参考程度に。

#include<windows.h>
#include<objidl.h>
#include<stdio.h>

//Office2003
#import "C:\Program Files\Common Files\Microsoft Shared\Office11\MSO.DLL" no_namespace rename("DocumentProperties", "DocumentPropertiesXL")
#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\Vbe6ext.olb" no_namespace
#import "C:\Program Files\Microsoft Office\Office11\EXCEL.EXE" rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") rename("DocumentProperties", "DocumentPropertiesXL") no_dual_interfaces

static LPSTR UnicodeToAnsi(LPWSTR uni)
{
const DWORD size = ::WideCharToMultiByte(CP_ACP, 0, uni, -1, NULL, 0, NULL, NULL);
LPSTR p = (LPSTR)::malloc(size);
::WideCharToMultiByte(CP_ACP, 0, uni, -1, p, size, NULL, NULL);
return p;
}

static void DisplayXLS()
{
using namespace Excel;

_ApplicationPtr pXL;

//Excelの起動
pXL.CreateInstance(L"Excel.Application");

//Excelを非表示にする
pXL->Visible = FALSE;

//WorkBookを追加する
WorkbooksPtr pBooks = pXL->Workbooks;

//xlsファイルを開く
_WorkbookPtr pBook = pBooks->Open("C:\\Book1.xls");
_WorksheetPtr pSheet = pXL->ActiveSheet;

//取り出すセル位置
LPCSTR pszCellNames[] =
{
"A1", "A2", "B1", "B2"
};

//表示する(保存したければ、此処でデータを拾って保存する)
for(int i = 0; i < 4; ++i)
{
const _variant_t var = pSheet->Range[pszCellNames[i]][vtMissing]->Value2;
switch(var.vt)
{
case VT_BSTR://セルが文字列
{
LPSTR pAnsi = ::UnicodeToAnsi(var.bstrVal);
::printf("[セル番号 : %s][値 : %s]\n", pszCellNames[i], pAnsi);
::free(pAnsi);
}
break;

default://数値(その他いろいろあるが、割愛)
{
const LONG lVal = var;
::printf("[セル番号 : %s][値 : %d]\n", pszCellNames[i], lVal);
}
}
}

//Excelの終了
pXL->Quit();
}

int main()
{
::CoInitialize(0);
::DisplayXLS();
::CoUninitialize();
return 0;
}

投稿日時 - 2009-08-19 23:42:24

ANo.1

ちょっと前提条件を整理させてください。
・実行プログラムはあるがソース(や附随する設計書)はない。
・「Excel形式の表で表示」を画面のみに行い、Excelファイルは存在しない。
であっていますでしょうか?

上記前提とすると、
>現在毎度ファイルを指定してデータを読み込んでいるのをフォルダをしてファルダ内のファイルをすべて読み込ませるようし
単純にはキーボードマクロのような一定動作をさせるアプリを使用して一連の動作を連続して行うようなものを作る形になりますが、一般的なアプリの内容からすれば、そんな簡単には行かない気がします。
既存アプリが起動時のパラメータとしてファイルを指定できるような作りであれば、バッチ処理で逐次実行してみるという手もないわけではありません。

>Excel形式の表からデータを抜き出しどんな形式でもいいから結果データを保存
画面表示だけで、表示前の情報が中間データとしてファイル出力されていなければ難しいです。
画面の表示データをクリップボードにコピーしたとしても、それは「画像データ」でしかないため、そこから必要なデータを抽出する画像解析処理が必要となります。
また、仮に中間データがあったとしても、そのデータのフォーマットが不明な場合には、その内容の特定(解析)に時間を必要とします。

個人的には「既存アプリのソースがないのであれば、新しいプログラムを一から作りなおしたほうがよい」って内容に思えますが。

投稿日時 - 2009-08-19 13:11:46

あなたにオススメの質問