C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[1526] Re:[질문] 포맷을 할려면?
박지훈.임프 [cbuilder] 3737 읽음    1999-07-09 00:00
: 안녕하세요
: 디스크를 포맷하게 할려고 합니다.
: 델파이의 팁중에 괘찮은거 같아서 씨빌더로 해보았는데
: 에러가 납니다.
: 이유가 무엇인지 알고싶습니다, 또 어떡하면 정상적으로
: 포맷할지도 알고싶습니다.
: 가르쳐 주세요.
: 아래는 제가 한것입니다.
: 그럼 안녕히 계세요
:
: //---------------------------------------------------------------------------
: #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);
}

그럼 도움되시길...

+ -

관련 글 리스트
1515 [질문] 포맷을 할려면? 박세율 3574 1999/07/03
1526     Re:[질문] 포맷을 할려면? 박지훈.임프 3737 1999/07/09
1536         Re:[감사] 답변해 주셔서 감사드립니다. 박세율 3684 1999/07/10
1627             Re:Re:[감사] 답변해 주셔서 감사드립니다. 박지훈.임프 3710 1999/08/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.