|
common.h
main.cpp
|
#include <stdio.h>
void Add( );
int main()
{
nData = 10;
Add( );
printf( "%d\n", nData );
return 0;
}
| |
|
sub.cpp
|
(3) 関数より文字列を取得時にバッファを動的に確保 |
|
|
Win32 API の GetSystemDirectory 関数は、Windows のシステムディレクトリを取得する関数です。
関数の定義は以下のようになります
UINT GetSystemDirectory(
LPTSTR lpBuffer,
UINT uSize
);
lpBuffer は十分な領域を用意する必要があり、そのサイズを uSize として渡す
必要があります。Win32 API 関数としては典型的な作りになっています。
また、もし lpBuffer のサイズが足らない場合は、戻り値として実際に必要な
サイズが返されます。成功した場合は書き込まれたサイズが返されます。
但し、サイズが足らない場合は lpBuffer の内容は変化しませんので裏を
返せば uSize に 0 を指定すると必要なサイズが返されます。
メモリを動的に必要なサイズより多く確保してシステムディレクトリを表示して下さい
| |
|
|
#include <windows.h>
#include <stdio.h>
int main()
{
UINT nSize;
nSize = GetSystemDirectory( NULL, 0 );
// ここにコードを記述
return 0;
}
| |
|
|
|
|
問題 (3) のバッファ確保部分を Win32 APIの 同名の関数として作成して下さい
| |
|
|
#include <windows.h>
#include <stdio.h>
LPTSTR GetSystemDirectory( void );
int main()
{
LPTSTR lpBuff = GetSystemDirectory();
printf( "%s\n", lpBuff );
GlobalFree( lpBuff );
return 0;
}
LPTSTR GetSystemDirectory( void )
{
// ここにコードを記述
}
| |
|
|
|
|
メモリを動的確保すると、必ずどこかで解放する必要があります。
メモリに限らず、Windows API ではそのような場面にしょっちゅう遭遇するので、
プログラマがそのような「解放忘れ」をしないように「クラス」を利用します
以下は、問題 (4) をクラス化したものです。完成させて、さらに、GetWindowsDirectory を追加実装して下さい
| |
|
|
#include <windows.h>
#include <stdio.h>
class MyClass {
public:
LPTSTR lpBuff;
LPTSTR GetSystemDirectory( void );
MyClass()
{
// インスタンスの初期処理
lpBuff = NULL;
}
virtual ~MyClass()
{
// インスタンスの終了処理
if ( lpBuff != NULL ) {
GlobalFree( lpBuff );
}
}
};
LPTSTR MyClass::GetSystemDirectory( void )
{
// ここにコードを記述
}
int main()
{
MyClass MyInstance;
MyInstance.GetSystemDirectory();
printf( "%s\n", MyInstance.lpBuff );
return 0;
}
| |
|
|
|
|
#include <windows.h>
#include <stdio.h>
class MyClass {
public:
LPTSTR lpBuff;
LPTSTR GetSystemDirectory( void );
LPTSTR GetWindowsDirectory( void );
operator = ( MyClass &MyInstance );
MyClass()
{
// インスタンスの初期処理
lpBuff = NULL;
}
virtual ~MyClass()
{
// インスタンスの終了処理
if ( lpBuff != NULL ) {
GlobalFree( lpBuff );
}
}
};
// = 演算子の動作 (デフォルト動作のオーバーロード)
MyClass::operator = ( MyClass &MyInstance )
{
// ここにコードを記述
}
LPTSTR MyClass::GetSystemDirectory( void )
{
}
LPTSTR MyClass::GetWindowsDirectory( void )
{
}
int main()
{
MyClass MyInstance,MyInstance2;
MyInstance.GetSystemDirectory();
printf( "%s\n", MyInstance.lpBuff );
MyInstance2 = MyInstance;
// この代入は書き換えると以下のようになります
// MyInstance2.operator = (MyInstance);
printf( "%s\n", MyInstance2.lpBuff );
return 0;
}
| |
|
|
|
|
( char * ) というキャストの動作も変更する事がてきるので、以下のような記述が可能になります
これをふまえて、( int ) というキャストした場合に文字列の長さを返すようにして下さい
| |
|
|
#include <windows.h>
#include <stdio.h>
class MyClass {
public:
LPTSTR lpBuff;
LPTSTR GetSystemDirectory( void );
LPTSTR GetWindowsDirectory( void );
operator = ( MyClass &MyInstance );
operator char* ();
MyClass()
{
// インスタンスの初期処理
lpBuff = NULL;
}
virtual ~MyClass()
{
// インスタンスの終了処理
if ( lpBuff != NULL ) {
GlobalFree( lpBuff );
}
}
};
MyClass::operator char* ()
{
return lpBuff;
}
// 他のメンバ関数の定義を省略
int main()
{
MyClass MyInstance,MyInstance2;
MyInstance.GetSystemDirectory();
printf( "%s\n", (LPTSTR)MyInstance );
MyInstance2 = MyInstance;
MyInstance2.operator = (MyInstance);
printf( "%s\n", (LPTSTR)MyInstance2 );
return 0;
}
| |
|
|
|