: 안녕하세요
: 디스크를 포맷하게 할려고 합니다.
: 델파이의 팁중에 괘찮은거 같아서 씨빌더로 해보았는데
: 에러가 납니다.
: 이유가 무엇인지 알고싶습니다, 또 어떡하면 정상적으로
: 포맷할지도 알고싶습니다.
: 가르쳐 주세요.
: 아래는 제가 한것입니다.
: 그럼 안녕히 계세요
:
: //---------------------------------------------------------------------------
: #include <vcl.h>
: #pragma hdrstop
:
: #include "Unit1.h"
: //---------------------------------------------------------------------------
: #pragma package(smart_init)
: #pragma resource "*.dfm"
: #define SHFMT_ID_DEFAULT 0xFFFF // Formating options
: #define SHFMT_OPT_QUICKFORMAT 0x0000
: /*#define 0x0001 SHFMT_OPT_FULL
: #define 0x0002 SHFMT_OPT_SYSONLY // Error codes
: #define 0xFFFFFFFF SHFMT_ERROR
: #define 0xFFFFFFFE SHFMT_CANCEL
: #define 0xFFFFFFFD SHFMT_NOFORMAT
: */
:
: TForm1 *Form1;
: extern "C" __declspec(dllimport) long SHFormatDrive(HWND,
: UINT,
: UINT,
: UINT);
:
: __declspec(dllimport) long format(HWND,UINT,UINT,UINT);
: typedef long (*Func)(HWND,UINT,UINT,UINT);
:
: //---------------------------------------------------------------------------
: __fastcall TForm1::TForm1(TComponent* Owner)
: : TForm(Owner)
: {
: }
: //---------------------------------------------------------------------------
:
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: Func myfunc;
: HINSTANCE hinst=LoadLibrary("shell32.dll");
: myfunc=(Func)GetProcAddress(hinst,"_SHFormatDrive");
: long ret;
: ret=myfunc(Application->Handle,0,SHFMT_ID_DEFAULT,SHFMT_OPT_QUICKFORMAT);
:
: if (ret < 0) ShowMessage("지정한 드라이브를 포맷하지 못했습니다.");
:
: FreeLibrary(hinst);
:
: }
: //---------------------------------------------------------------------------
:
임펠리테리입니다.
말레이지아에 출장을 와있어서 좀 바쁜 관계로 답변이 늦어 죄송합니다.
보여주신 소스에서 잘못된 부분은 단 한 글자 입니다. ^^;;
버튼의 클릭 이벤트 핸들러에서 GetProcAddress() 함수로 포맷 함수의
어드레스를 얻어올 때, 인자로 넘겨준 _SHFormatDrive 가 틀렸습니다.
올바른 인자는 SHFormatDrive입니다. 앞에 '_'가 없죠.
그래서 NULL이 리턴값으로 넘어왔고, 그것을 에러 검사 없이 함수의
포인터로 삼아서 바로 실행해버렸기 때문입니다. 그래서 억세스 바이얼레이션이
생기는 거죠. 다시 완전한 소스를 보여드립니다.
__declspec(dllimport) long format(HWND, UINT, UINT, UINT);
typedef long (*Func)(HWND, UINT, UINT, UINT);
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HINSTANCE hinst=LoadLibrary("shell32.dll");
Func myfunc=(Func)GetProcAddress(hinst, "SHFormatDrive");
long ret = myfunc(Application->Handle, 0, SHFMT_ID_DEFAULT, SHFMT_OPT_QUICKFORMAT);
if (ret < 0) ShowMessage("지정한 드라이브를 포맷하지 못했습니다.");
FreeLibrary(hinst);
}
그럼 도움되시길...
|