ファイうアップロードはできていませんが、DirectShowのバージョンアップに使ったFileListを例として、BCCForm and BCCSkeltonでDLLを作る過程を説明してみましょう。
まず、DLLの中身ですが、小さくは一つの関数から大きくは一連の処理を行える一つのプログラムまで色々です。簡単な関数を使ったDLLの解説はWEBで結構ありますから、ここではダイアログを使ったDLLの開発を、BCCForm and BCCSkeltonの特徴を踏まえて解説します。具体的にはFileListというダイアログベースのスタンドアロンのプログラムをBCCDeveloper(STLとかCOMとか使わないので、bcc32で行けます)でつくり、それを丸ごと(今の人は「まるっと」というんですか?馴染めないなぁ)DLL化します。
1.仕様
(1)メニュー、ツールバー、ステータスバーを備えたダイアログベースで、リストビューをクライアントエリアに張り付ける。
(2)データはファイル入出力を行え、データ形式は、「一行が『"(ファイルのフルパス名)","(コメント文字列)"(CRLF)』というテキストファイル」にする。
(3)上記一行データは「追加」、「検索」、「編集」、「削除」が行え、再生順等で並び替えができるようにする。
(4)このダイアログ終了時に「データファイルのフルパス名の文字列ポインター」(従ってダイアログ消滅時に独立したデータ領域を持ち、それが書き換えられる前にコピーする必要があります)を返し、選択されていない場合はヌルポインター(注)を返します。
注:C++11ではstd::nullptr_tという型ができたそうですが、私はいい加減なので値が"NULL(オブジェクトが何もない)"を指しているポインターのみならず、ポインターの値がNULL(0)とかもそういうことがありますので注意してくださいね。
2.リソースとプログラム
内容が似ていたので、前に開設したIDListを流用して作ります。
(1)リソース
//-----------------------------------------
// BCCForm Ver 2.41
// An Easy Resource Editor for BCC
// Copyright (c) February 2002 by ysama
//-----------------------------------------
#include "ResFileList.h"
#define TBSTYLE_TOOLTIPS 0x0100
//#define SBT_TOOLTIPS 0x0800 //【ステータスバーの怪】SB_SETTIPTEXT参照
//----------------------------------
// ダイアログ (IDD_MAIN)
//----------------------------------
IDD_MAIN DIALOG DISCARDABLE 0, 0, 480, 270
EXSTYLE WS_EX_DLGMODALFRAME | WS_EX_TOPMOST
STYLE WS_POPUP | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | DS_SETFONT | DS_CENTER
CAPTION "FileList"
MENU IDM_FORM_MENU
FONT 9, "MS 明朝"
{
// CONTROL "", IDC_STATUSBAR, "MSCTLS_STATUSBAR32", WS_CHILD | WS_VISIBLE | SBT_TOOLTIPS | CCS_TOP | CCS_NOMOVEY, 0, 0, 480, 12 //同じくコメントアウトしています
CONTROL "", IDC_STATUSBAR, "MSCTLS_STATUSBAR32", WS_CHILD | WS_VISIBLE | CCS_TOP | CCS_NOMOVEY, 0, 0, 480, 12
CONTROL "", IDC_TOOLBAR, "TOOLBARWINDOW32", WS_CHILD | WS_VISIBLE | WS_BORDER |TBSTYLE_SEP | TBSTYLE_TOOLTIPS, 0, 0, 480, 19
CONTROL "", IDC_LISTVIEW, "SYSLISTVIEW32", WS_CHILD | WS_VISIBLE | WS_BORDER | LVS_REPORT, 0, 21, 480, 235, WS_EX_CLIENTEDGE
}
//(解説:これはIDListでSDIウィンドウであったものをダイアログにしたものです。サイズ変更枠を使い、システムメニューも付けていますのでウィンドウと変わりません。)
//----------------------------------
// ダイアログで使用するメニュー
//----------------------------------
IDM_FORM_MENU MENU DISCARDABLE
{
POPUP "ファイル(&F)"
{
MENUITEM "リストを開く(&O)", IDM_OPEN
MENUITEM SEPARATOR
MENUITEM "リストの保存(&S)", IDM_SAVE
MENUITEM SEPARATOR
MENUITEM "終了(&X)", IDM_EXIT
}
POPUP "編集(&E)"
{
MENUITEM "追加(&A)", IDM_ADD
MENUITEM "検索(&S)", IDM_SEARCH
MENUITEM "編集(&E0", IDM_EDIT
MENUITEM "削除(&D)", IDM_DELETE
}
POPUP "表示(&V)"
{
MENUITEM "並び替え(&S)", IDM_SORT
}
POPUP "ヘルプ(&H)"
{
MENUITEM "バージョン情報(&V)", IDM_VERSION
}
}
//(解説:名前が違うほか、ほとんどIDListと変わりません。)
//----------------------------------
// ダイアログ (IDD_EDIT)
//----------------------------------
IDD_EDIT DIALOG DISCARDABLE 0, 0, 360, 132
EXSTYLE WS_EX_DLGMODALFRAME
STYLE WS_POPUP | WS_DLGFRAME | WS_CAPTION | WS_SYSMENU | DS_SETFONT | DS_CENTER
CAPTION "リストの編集"
FONT 9, "MS 明朝"
{
CONTROL "", IDC_EDIT1, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | ES_AUTOHSCROLL | ES_LEFT | ES_NUMBER, 87, 9, 264, 12, WS_EX_CLIENTEDGE
CONTROL "", IDC_EDIT2, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | ES_AUTOHSCROLL | ES_LEFT | ES_READONLY, 87, 24, 264, 12, WS_EX_CLIENTEDGE
CONTROL "", IDC_EDIT3, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | ES_MULTILINE | ES_LEFT | WS_VSCROLL | ES_WANTRETURN, 87, 39, 264, 66
CONTROL "編集終了", IDOK, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON, 288, 110, 60, 18
CONTROL "再生順", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY | SS_SUNKEN, 6, 9, 75, 12
CONTROL "ファイル名", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY | SS_SUNKEN, 6, 24, 75, 12
CONTROL "備考", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY | SS_SUNKEN, 6, 39, 75, 15
}
//(解説:これは変更しています。まず"フルパスファイル名"は編集させないので表示せず、「No(再生順位)」(編集可)、「(ファイルパス無し)ファイル名」(編集不可)、「備考(自由なコメント)」(編集可)の3つにしています。)
//----------------------------------
// ダイアログ (IDD_SEARCH)
//----------------------------------
IDD_SEARCH DIALOG DISCARDABLE 0, 0, 180, 48
EXSTYLE WS_EX_DLGMODALFRAME
STYLE WS_POPUP | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_SETFONT | DS_CENTER
CAPTION "リストの検索"
FONT 9, "MS 明朝"
{
CONTROL "", IDC_EDIT1, "EDIT", WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL | ES_LEFT, 3, 15, 171, 12, WS_EX_CLIENTEDGE
CONTROL "OK", IDOK, "BUTTON", WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON, 66, 30, 45, 15
CONTROL "検索する文字列", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 6, 3, 123, 9
}
//(解説:IDListと全く同じです。)
//----------------------------------
// ダイアログ (IDD_SORT)
//----------------------------------
IDD_SORT DIALOG DISCARDABLE 0, 0, 189, 87
EXSTYLE WS_EX_DLGMODALFRAME
STYLE WS_POPUP | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_SETFONT | DS_CENTER
CAPTION "リストの並べ替え"
FONT 9, "MS 明朝"
{
CONTROL "", IDC_COMBOBOX1, "COMBOBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | CBS_DROPDOWNLIST | WS_VSCROLL, 12, 18, 165, 60
CONTROL "", IDC_COMBOBOX2, "COMBOBOX", WS_CHILD | WS_VISIBLE | WS_TABSTOP | CBS_DROPDOWNLIST | WS_VSCROLL, 12, 48, 165, 60
CONTROL "サブアイテムの選択", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 15, 6, 93, 9
CONTROL "並べ替え方法", 0, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 15, 36, 93, 9
CONTROL "完了", IDOK, "BUTTON", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 75, 66, 39, 15
}
//(解説:IDListと全く同じです。)
//----------------------------------
// ダイアログ (IDD_VERSION)
//----------------------------------
IDD_VERSION DIALOG DISCARDABLE 0, 0, 186, 40
EXSTYLE WS_EX_DLGMODALFRAME
STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_MODALFRAME | DS_3DLOOK | DS_CENTER
CAPTION "バージョン情報"
FONT 9, "Times New Roman"
{
CONTROL IDI_ICON, 0, "STATIC", SS_SUNKEN | SS_ICON | WS_CHILD | WS_VISIBLE, 6, 6, 26, 26
CONTROL "FileList Ver 1.0\r\n(c) Copyright by Ysama 2022", 0, "STATIC", SS_CENTER | SS_SUNKEN | WS_CHILD | WS_VISIBLE, 40, 6, 102, 24
CONTROL "OK", IDOK, "BUTTON", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 150, 12, 32, 16
}
//(解説:アイコン、表示名以外はIDListと全く同じです。)
//----------------------------------
// ダイアログで使用するイメージ
//----------------------------------
IDI_ICON ICON DISCARDABLE "Icon.ico"
//--------------------------
// イメージ(IDI_TOOLBAR)
//--------------------------
IDI_TOOLBAR BITMAP DISCARDABLE "ToolBar.bmp"
//(解説:完全にメニューに倣ったビットマップにしています。)
定数は100から700まで順に並べただけなのでResFileList.hは省略します。
