プロが教える店舗&オフィスのセキュリティ対策術

表題にもありますが、
http://www.vector.co.jp/soft/win95/util/se210113 …
のSafeMelt32.DLLを使って、

http://www2.ttcn.ne.jp/tkky/Application/Extract/ …
http://www2.ttcn.ne.jp/tkky/Application/Compress …
のサイトのまねをして、圧縮解凍ソフトを作りたいのですが、単純に、コードの中の「Unlha」を「SafeMelt32」に置き換えればいいのでしょうか?

それとも、もっと別なことを読み取らないといけないのでしょうか?

C++は初めてなので、できれば、修正個所をどういう風にすればいいのか、具体的に指示してくださると助かります。

環境は、C++Builderです。

Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
{
// DLL のロード
hDll = LoadLibrary("UNLHA32.DLL");

if (!hDll) {
// DLL が見つからなかった場合
Application->MessageBox(
"UNLHA32.DLL が見つかりませんでした。",
"DLL エラー",
MB_ICONSTOP | MB_OK);
Close();
} else
// DLL があったら関数ポインタを取得する
Unlha = (ProcUnlha)GetProcAddress(hDll, "Unlha");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
// DLL の解放
if (hDll) FreeLibrary(hDll);
}
//---------------------------------------------------------------------------
// 書庫ファイル作成
void __fastcall TForm1::CompressBtnClick(TObject *Sender)
{
AnsiString ArchiveName, // 書庫名
CompressName, // 圧縮するファイル名
cmdLine; // コマンド変数

// 圧縮用のフィルタを設定する。
OpenDialog1->Filter = "すべてのファイル(*.*)|*.*";

// ファイルが選択されなければ処理終わり
if (!OpenDialog1->Execute()) return;

// 選択したファイル名を圧縮ファイル名として使う
CompressName = OpenDialog1->FileName;
ArchiveName = ChangeFileExt(CompressName, ".lzh");

// コマンドライン作成(空白パスなどには未対応)
cmdLine = "a " + ArchiveName // 書庫名
+ " " + CompressName; // 圧縮するファイル名

// Unlha 操作
Unlha(Application->Handle, cmdLine.c_str(), "", 0);

// 結果表示用 Memo1 をクリア
Memo1->Lines->Clear();
Memo1->Lines->Add("ファイル \"" + ArchiveName + "\" が作成されました。");
}
//---------------------------------------------------------------------------
// 書庫ファイル展開
void __fastcall TForm1::ExtractBtnClick(TObject *Sender)
{
AnsiString lzhName, // 書庫名
cmdLine; // コマンド変数

OpenDialog1->Filter = "圧縮ファイル(*.lzh)|*.lzh";

// ファイルが選択されなければ処理終わり
if (!OpenDialog1->Execute()) return;

lzhName = OpenDialog1->FileName;// 解凍ファイル名

// コマンドライン作成(空白パスなどには未対応)
cmdLine = "x " + lzhName;// 解凍する書庫名

// Unlha 操作
Unlha(Application->Handle, cmdLine.c_str(), "", 0);

// 結果表示用 Memo1 をクリア
Memo1->Lines->Clear();
Memo1->Lines->Add("ファイル \"" + lzhName + "\" の解凍が終了しました。");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ExitBtnClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------



Unit1.h

字数制限のため省略


private: // ユーザー宣言
// DLL のロードのための変数宣言
HINSTANCE hDll;

// DLL 呼び出し関数の宣言("Unlha32.dll" の Unlha 関数を呼び出す)
typedef int WINAPI (*ProcUnlha)(const HWND _hwnd,
LPCSTR _szCmdLine,
LPSTR _szOutput,
const DWORD _dwSize);

// 関数ポインタ
ProcUnlha Unlha;

public: // ユーザー宣言
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

ソースは、上のページのものを掲載しました。

どこをどう直せばよいのかご教授願います。
よろしくお願いいたします。

質問者からの補足コメント

  • うーん・・・

    すいません。C++は初めて。と書きましたが、何が書いてあるのかは読めるレベルです。でも専門ではないので、初心者レベルです。よろしくお願いいたします。

      補足日時:2016/04/10 17:11

A 回答 (1件)

参考にされているサイト様にも書かれているように


>●提供される DLL の情報・仕様の読解力。
こちらが要求されます。
SafeMelt32.DLLと同梱のapi_ref.txtに必要な関数の使い方が書いてありますので、
そちらを読みながら適切な関数を呼び出してください。

シェアウェアなところとか、XPまでにしか対応してないところとか気になりますが。
    • good
    • 0
この回答へのお礼

回答くださりありがとうございました。方針を変えたので同じ表題の②にて再質問いたしました。もしよろしければ、よろしくお願いいたします。

お礼日時:2016/04/11 20:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!