Q&A

  • [질문] 프린터의 인쇄기본설정이나 속성창을 열수 있을까요??

프린터 다이얼로그 사용하지 않고..

프린터의 인쇄기본설정 및 속성창 여는 방법 좀 알려주세요..

Winspool.PrinterProperties 를 이용하는 방법이 있지 않을까요??

고수님들의 조언 기다리겠습니다.. ㅠㅠ

다들, 수고하세요..
1  COMMENTS
  • Profile
    홍성락 2008.05.29 04:56
    delmadang에 [민성기]님이 올리신 소스가 있어요. 질문과 답변 {[추가] 프린터 추가 마법사~ ^^} 제목입니다
    target=_blank>http://www.delmadang.com/community/bbs_view.asp?bbsNo=17&bbsCat=41&indx=277177&keyword1=[추가]&keyword2=프린터


    원하시는게 이것인지 잘 모르겠네요.

    확인차 테스트한 소스입니다

    일단 유닛하나 만들어 넣구요
    <!--CodeS-->
    unit Unit2;

    INTERFACE

    USES
    Windows, // hResult, Failed, Succeeded, ZeroMemory, CopyMemory
    ActiveX, // IMalloc
    ShlObj; // Shell Objects: pItemIDList, IShellFolder


    FUNCTION ExecuteAddPrinter: BOOLEAN;
    FUNCTION GetAddPrinterItem(CONST Allocator: IMalloc): pItemIDList;

    FUNCTION GetItemIDName(CONST Folder: IShellFolder;
    CONST ItemIDList: pItemIDList;
    CONST Flags: INTEGER;
    CONST Name: pCHAR;
    CONST MaxNameLength: INTEGER): BOOLEAN;
    FUNCTION GetPrinterItemIDList(CONST DeskTopFolder: IShellFolder): pItemIDList;
    FUNCTION GetThisPrinter(CONST PrinterName: STRING;
    CONST Allocator: IMalloc): pItemIDlist;

    FUNCTION ItemIDListCreate(CONST Allocator: IMalloc;
    CONST size: INTEGER): pItemIDList;
    FUNCTION ItemIDListGetNextItem(CONST ItemIDList: pItemIDList): pItemIDList;
    FUNCTION ItemIDListGetSize(CONST ItemIDList: pItemIDList): INTEGER;

    FUNCTION ItemIDListsConcatenate(CONST Allocator: IMalloc;
    CONST List1, List2: pItemIDList):
    pItemIDlist;

    FUNCTION OpenPrinterProperties(CONST PrinterName: STRING): BOOLEAN;
    FUNCTION OpenThisPrinter(CONST PrinterName: STRING): BOOLEAN;

    IMPLEMENTATION

    USES
    ShellAPI, // TShellExecuteInfo, ShellExecuteEx
    SysUtils; // Exception

    TYPE
    ESHprintersError = CLASS(Exception);


    // See ExecuteAddPrinter in Printers.CPP (line 359)
    FUNCTION ExecuteAddPrinter: BOOLEAN;
    VAR
    AddPrinterItemIDList: pItemIDList;
    Allocator : IMalloc;
    ShellExecuteInfo : TShellExecuteInfo;
    BEGIN
    RESULT := FALSE;

    IF CoGetMalloc(MEMCTX_TASK, Allocator) = S_OK
    THEN BEGIN
    AddPrinterItemIDList := GetAddPrinterItem(Allocator);
    TRY
    IF AddPrinterItemIDList = NIL
    THEN RESULT := FALSE
    ELSE BEGIN
    ZeroMemory(@ShellExecuteInfo, SizeOf(TShellExecuteInfo));

    WITH ShellExecuteInfo DO
    BEGIN
    cbSize := SizeOf(TShellExecuteInfo);
    fMask := SEE_MASK_INVOKEIDLIST OR SEE_MASK_FLAG_NO_UI;
    lpIDList := AddPrinterItemIDlist;
    nShow := SW_SHOWDEFAULT
    END;

    ShellExecuteEx(@ShellExecuteInfo);
    RESULT := TRUE
    END
    FINALLY
    Allocator.Free(AddPrinterItemIDList)
    END
    END
    END {ExecuteAddPrinter};


    // See GetAddPrinterItem in Printers.CPP (line 428)
    FUNCTION GetAddPrinterItem(CONST Allocator: IMalloc): pItemIDList;
    VAR
    DeskTopFolder : IShellFolder;
    EnumIDList : IEnumIDList;
    hOK : hResult;
    PrinterItemIDList: pItemIDList;
    PrintersFolder : IShellFolder;
    Retrieved : INTEGER;
    TargetItemIDList : pItemIDList;
    TempItemIDList : pItemIDList;
    pceltFetched: ULONG;
    BEGIN
    TargetItemIDList := NIL;

    IF Allocator <> NIL
    THEN BEGIN

    IF Succeeded(SHGetDesktopFolder(DeskTopFolder))
    THEN BEGIN

    PrinterItemIDList := GetPrinterItemIDList(DeskTopFolder);
    IF PrinterItemIDList <> NIL
    THEN BEGIN
    // Get the IShellFolder for Printers
    hOK := DeskTopFolder.BindToObject(PrinterItemIDList,
    NIL,
    IID_IShellFolder,
    Pointer(PrintersFolder));
    IF Succeeded(hOK)
    THEN BEGIN
    IF Succeeded(PrintersFolder.EnumObjects(
    0, SHCONTF_FOLDERS OR SHCONTF_NONFOLDERS, EnumIDList))
    THEN BEGIN
    // Get the first item's ItemIDList.
    // This will be the item for adding a printer.
    pceltFetched := Retrieved;
    hOK := EnumIDList.Next(1, TempItemIDList, pceltFetched );

    Retrieved := pceltFetched;

    IF (Retrieved > 0) AND Succeeded(hOK)
    THEN TargetItemIDList := ItemIDListsConcatenate(Allocator,
    PrinterItemIDList,
    TempItemIDList);

    END

    END
    END

    END;
    END;

    RESULT := TargetItemIDList
    END {GetAddPrinterItem};


    // See GetItemIDName in Printers.CPP (line 551)
    FUNCTION GetItemIDName(CONST Folder: IShellFolder;
    CONST ItemIDList: pItemIDList;
    CONST Flags: INTEGER;
    CONST Name: pCHAR;
    CONST MaxNameLength: INTEGER): BOOLEAN;
    VAR
    p : PCHAR;
    StrRet: TStrRet;
    BEGIN
    RESULT := TRUE; // Be optimistic
    IF Succeeded(Folder.GetDisplayNameOf(ItemIDList, Flags, StrRet))
    THEN BEGIN
    CASE StrRet.uType OF
    STRRET_WSTR: WideCharToMultiByte(CP_ACP, 0, StrRet.pOleStr,
    -1, Name, MaxNameLength,
    NIL, NIL);

    STRRET_OFFSET:
    BEGIN
    p := pCHAR(ItemIDlist);
    INC(p, StrRet.uOffset);
    StrLCopy(Name, p, MaxNameLength)
    END;

    STRRET_CSTR: StrLCopy(Name, StrRet.cStr, MaxNameLength)

    ELSE
    RESULT := FALSE
    END
    END
    ELSE RESULT := FALSE
    END {GetItemIDName};


    // See GetPrintersPidl in Printers.CPP (line 406)
    FUNCTION GetPrinterItemIDList(CONST DeskTopFolder: IShellFolder): pItemIDlist;
    VAR
    hOK : hResult;
    PrinterItemIDList: pItemIDList;
    BEGIN
    IF DeskTopFolder = NIL
    THEN RESULT := NIL
    ELSE BEGIN
    hOK := SHGetSpecialFolderLocation(
    0,
    CSIDL_PRINTERS, // Virtual folder of installed printers
    PrinterItemIDList);
    IF Failed(hOK)
    THEN RESULT := NIL
    ELSE RESULT := PrinterItemIDList
    END
    END {GetPrinterItemIDList};


    // See GetThisPrinter in Printers.CPP (line 485)
    FUNCTION GetThisPrinter(CONST PrinterName: STRING;
    CONST Allocator: IMalloc): pItemIDlist;
    VAR
    Continue : BOOLEAN;
    DeskTopFolder : IShellFolder;
    EnumIDList : IEnumIDList;
    hOK : hResult;
    PrinterItemIDList: pItemIDList;
    PrintersFolder : IShellFolder;
    Retrieved : INTEGER;
    TargetItemIDList : pItemIDList;
    TempItemIDList : pItemIDList;
    TempString : ARRAY[0..255] OF CHAR;
    pceltFetched: ULONG;
    BEGIN
    TargetItemIDList := NIL;

    IF Allocator <> NIL
    THEN BEGIN

    IF Succeeded(SHGetDesktopFolder(DeskTopFolder))
    THEN BEGIN

    PrinterItemIDList := GetPrinterItemIDList(DeskTopFolder);
    IF PrinterItemIDList <> NIL
    THEN BEGIN

    // Get the IShellFolder for Printers
    hOK := DeskTopFolder.BindToObject(PrinterItemIDList,
    NIL,
    IID_IShellFolder,
    Pointer(PrintersFolder));
    IF Succeeded(hOK)
    THEN BEGIN
    IF Succeeded(PrintersFolder.EnumObjects(
    0, SHCONTF_FOLDERS OR SHCONTF_NONFOLDERS, EnumIDList))
    THEN BEGIN
    continue := TRUE;
    WHILE continue
    DO BEGIN
    pceltFetched := Retrieved;
    hOK := EnumIDList.Next(1, TempItemIDList, pceltFetched);
    Retrieved := pceltFetched;
    // Check its name
    GetItemIDName(PrintersFolder, TempItemIDList, SHGDN_NORMAL,
    @TempString, SizeOf(TempString));
    continue := Succeeded(hOK) AND (Retrieved > 0) AND
    (StrIComp(TempString, pChar(PrinterName)) <> 0);
    END;

    IF (Retrieved > 0) AND Succeeded(hOK)
    THEN TargetItemIDList := ItemIDListsConcatenate(Allocator,
    PrinterItemIDList,
    TempItemIDList);

    END

    END
    END
    END
    END;

    RESULT := TargetItemIDList;
    END {GetThisPrinter};


    // See Pidl_Create in Printers.CPP (line 689)
    // Returns a pointer to the new ItemIDList, or NIL if a problem occurred.
    FUNCTION ItemIDListCreate(CONST Allocator: IMalloc;
    CONST size: INTEGER): pItemIDList;
    VAR
    NewItemIDList: pItemIDList;
    BEGIN
    NewItemIDList := Allocator.Alloc(size);

    IF NewItemIDList <> NIL
    THEN ZeroMemory(NewItemIDList, size);

    RESULT := NewItemIDList
    END {ItemIDListCreate};

    // See Pidl_GetNextItem in Printers.CPP (line 710)
    // Returns a pointer to the next item in the ItemIDList
    // (Microsoft's Pidl_GetNextItem)
    FUNCTION ItemIDListGetNextItem(CONST ItemIDList: pItemIDList): pItemIDList;
    BEGIN
    IF ItemIDlist = NIL
    THEN RESULT := NIL
    ELSE RESULT := Pointer(INTEGER(ItemIDList) + ItemIDList.mkid.cb)
    END {ItemIDListGetNextItem};


    // See Pidl_GetSize in Printers.CPP (line 655)
    // Returns total number of bytes in an ItemIDList (Microsoft's Pidl_GetSize)
    FUNCTION ItemIDListGetSize(CONST ItemIDList: pItemIDList):
    INTEGER; {size in bytes}
    VAR
    TempItemIDList: pItemIDList;
    BEGIN
    RESULT := 0;
    TempItemIDList := ItemIDList;

    IF TempItemIDList <> NIL
    THEN BEGIN
    WHILE (TempItemIDList.mkid.cb > 0) DO
    BEGIN
    INC(RESULT, TempItemIDList.mkid.cb);
    TempItemIDList := ItemIDListGetNextItem(TempItemIDList)
    END;

    // Requires a 16 bit zero value for the null terminator
    INC(RESULT, 2*SizeOf(BYTE))
    END
    END {ItemIDListGetSize};


    // See Pidl_Concatenate in Printers.CPP (line 612)
    // Creates a new ItemIDList with List1 appended to List2
    FUNCTION ItemIDListsConcatenate(
    CONST Allocator: IMalloc;
    CONST List1, List2: pItemIDList): pItemIDlist;
    VAR
    List1Length : INTEGER;
    List2Length : INTEGER;
    NewItemIDList: pItemIDList;
    BEGIN
    List1Length := 0;
    // List1 can possibly be NIL if it points to the desktop. Since we only
    // need a sngle NIL terminator, we remove the extra 2 bytes from the size
    // of the first ItemIDList
    IF List1 <> NIL
    THEN List1Length := ItemIDListGetSize(List1) - 2*SizeOf(BYTE);

    List2Length := ItemIDListGetSize(List2);

    // Create a new ItemIDList that is the size of List1 and List2, then
    // copy List1 and List2 to the new list.

    NewItemIDList := ItemIDListCreate(Allocator, List1Length + List2Length);

    IF NewItemIDList <> NIL
    THEN BEGIN
    IF List1 <> NIL
    THEN CopyMemory(NewItemIDList, List1, List1Length);

    CopyMemory(Pointer(INTEGER(NewItemIDList) + List1Length),
    List2, List2Length)
    END;

    RESULT := NewItemIDList
    END {ItemIDListsConcatenate};


    // See OpenThisPrinter in Printers.CPP (line 233)
    FUNCTION OpenThisPrinter(CONST PrinterName: STRING): BOOLEAN;
    VAR
    Allocator : IMalloc;
    PrinterItemIDList: pItemIDList;
    ShellExecuteInfo : TShellExecuteInfo;
    BEGIN
    RESULT := FALSE;

    IF CoGetMalloc(MEMCTX_TASK, Allocator) = S_OK
    THEN BEGIN

    PrinterItemIDList := GetThisPrinter(PrinterName, Allocator);
    TRY
    IF PrinterItemIDList = NIL
    THEN RESULT := FALSE
    ELSE BEGIN
    ZeroMemory(@ShellExecuteInfo, SizeOf(TShellExecuteInfo));

    WITH ShellExecuteInfo DO
    BEGIN
    cbSize := SizeOf(TShellExecuteInfo);
    fMask := SEE_MASK_INVOKEIDLIST OR SEE_MASK_FLAG_NO_UI;
    lpIDList := PrinterItemIDlist;
    nShow := SW_SHOWDEFAULT
    END;

    ShellExecuteEx(@ShellExecuteInfo);
    RESULT := TRUE
    END
    FINALLY
    Allocator.Free(PrinterItemIDList)
    END
    END
    END {OpenThisPrinter};


    // See OpenPrinterProperties in Printers.CPP (line 41)
    FUNCTION OpenPrinterProperties(CONST PrinterName: STRING): BOOLEAN;
    VAR
    Allocator : IMalloc;
    PrinterItemIDList: pItemIDList;
    ShellExecuteInfo : TShellExecuteInfo;
    BEGIN
    RESULT := FALSE;
    IF CoGetMalloc(MEMCTX_TASK, Allocator) = S_OK
    THEN BEGIN
    PrinterItemIDList := GetThisPrinter(PrinterName, Allocator);
    TRY
    IF PrinterItemIDList = NIL
    THEN RESULT := FALSE
    ELSE BEGIN
    ZeroMemory(@ShellExecuteInfo, SizeOf(TShellExecuteInfo));

    WITH ShellExecuteInfo DO
    BEGIN
    cbSize := SizeOf(TShellExecuteInfo);
    fMask := SEE_MASK_INVOKEIDLIST OR SEE_MASK_FLAG_NO_UI;
    lpIDList := PrinterItemIDlist;
    lpVerb := 'Properties';
    nShow := SW_SHOWDEFAULT
    END;

    ShellExecuteEx(@ShellExecuteInfo);
    RESULT := TRUE
    END
    FINALLY
    Allocator.Free(PrinterItemIDList)
    END
    END
    END {OpenPrinterProperties};


    END.

    <!--CodeE-->

    본 소스에서 선언하고 버튼을 눌러 프린터 이름으로 속성창을 여는겁니다
    <!--CodeS-->
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
    Printers, Unit2; //2개 추가합니다


    type
    TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    var
    PrinterName: String;
    begin
    ListBox1.Items := Printer.Printers; //일단 ListBox하나 놓고 PC의 모든 프린트 이름을 구합니다
    PrinterName := Printer.Printers[2]; //그중에서 3번째 리스트의 프린터 이름을 얻어
    OpenPrinterProperties(PrinterName); //Unit2의 함수를 불러 속성창을 띄웁니다
    end;

    end.

    <!--CodeE-->

    • 유경민
    • 2008.05.29 07:06
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2008.05.29 13:53
      http://www.codegear.com/downloads/regusers/delphi http://download.borlandforum.com/delphi/Delph...
    • 구창민
      2008.05.29 20:22
      이곳 자료실에 가셔서 'delphi 6' 으로 검색해보시면 두개의 업뎃팩을 보실 수 있을겁니다. 즐거운 프...
    • 유경민
      2008.06.03 06:56
      감사합니다~
    • 유종빈
    • 2008.05.29 03:55
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 홍성락
      2008.05.29 04:56
      delmadang에 [민성기]님이 올리신 소스가 있어요. 질문과 답변 {[추가] 프린터 추가 마법사~ ^^} 제목입...
    • 공성환
      2008.05.29 00:55
      FormatFloat 함수를 이용하셔도 될것같은데요... ShowMessage(FormatFloat('#,##0.0',7.0));
    • 강태원
      2008.05.29 02:31
      앗.... 그런 함수도 있군요!! 잘 동작 하네요. 알려주셔서 감사합니다.^^
    • 석주현
      2008.05.29 13:59
      전 주로 그냥 format 함수를 사용합니다. format('%2.1f',[7.0]); 보통 C 에서 쓰는 printf 와 비...
    • 강태원
      2008.06.10 02:52
      소나기님이 알려주신 방법도 좋을듯 하네요. 진작 알았으면 사용해 보는건데... 다음 프로젝트때 ...
    • 루루
    • 2008.05.28 04:20
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 루루
      2008.05.29 04:36
      답답해서 progdigy.com 을 뒤져 봤더니 비슷한 어려움을 겪은 케이스가 있었네요만, 그 해결책에 대한 답...
    • 루루
      2008.06.04 04:36
      ATi 라데온의 듀얼모니터 Threater 기능때문에 DSPACK234의 일부기능이 오작동 하는 것 같습니다. 지포...
    • 홍성락
    • 2008.05.29 00:59
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 화이팅
    • 2008.05.28 00:38
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      2008.05.28 01:40
      안녕하세요.. MDI 프로젝트에 대한 개념을 잡는 것이 먼저인것 같습니다.. 아래 내용을 숙독하시면...
    • steps
      2008.05.28 08:11
      제가 잘못 리해하지않았는지. 혹 string이나 widestring을 utf8로 남기는게 목적이라면 델파이의 UTF8Enc...
    • 이정욱
      2008.05.27 13:55
      아마 컴포넌트가 제데로 설치 되지 않은것 같습니다. 설치 방법이 있는 텍스트 파일을 잘 읽어보시고 ...
    • 석주현
      2008.05.27 15:51
      정확한 에러 메세지를 알려 주셔야 말씀을 드릴 수 있을 것 같습니다. 일단 이정욱님 말씀처럼 컴포넌...
    • steps
      2008.05.27 19:56
      저는 제오스6.61베타를 쓰는데요. 일단 packages 폴더안에서 component.dpk를 찾아 컴파일하고 그 다음...
    • 이정욱
      2008.05.27 13:56
      마이빌더가.. 뭔가요? ^^; 어디서 볼수 있는것인지.. 또 어떤프로그램인지 알아야 도움을 드릴 수 있을 ...
    • 가을바람
      2008.05.27 18:26
      덕분에 마이빌더가 뭔지알겠되었네요.. 좋아보이네요.. "마이빌더"로 검색해보시길.. 개발사홈피보면 델...
    • 이정욱
      2008.05.27 13:59
      코드로는 알려드리기가 힘들지만... XML 은 기본적으로 델파이에서 파싱이 가능합니다. XML을 읽어서....
    • 최용일
      2008.05.27 00:44
      uses절에 windows유닛을 추가하세요. CreateMutex함수는 windows유닛에 있습니다.
    • dbwrite
      2008.05.30 05:33
      예전에 CreateMutex를 이용하여 처리 하다 중복으로 실행 (프로그램을 잘못짜서그런지 )되는경우가 있어 ...
    • 최용일
      2008.05.26 20:03
      xFrame, yFrame 변수가 nil인지 체크해보세요...
    • 미닛메이드
      2008.05.26 20:35
      변수가 nil이란것이 정확히 어떤것인지 모르겠네요;;; frame에서 변수라는것이 정확히 어떤것이죠?
    • 깔쌈보이
      2008.05.26 20:50
      xFrame, xForm <= 이 것 역시 변수라고 볼 수가 있습니다. 근데 설마, xFrame, xForm이 클래스 명칭...
    • 미닛메이드
      2008.05.26 23:11
      type TfrmChat = class(TTntForm) //위에서 말한 xForm 클래스 구현부분 fmChatRo...
    • 미닛메이드
      2008.05.26 23:12
      xForm, xFrame, yFrame 등은 파일이름입니다. fmChatRoom 은 폼 이름
    • 이정욱
      2008.05.26 23:41
      위의 질문에서는 사실 잘못된 점을 꼬집어 드릴수 없을것 같습니다. 엑세스 바이올레이션 에러는 선언...
    • 한상훈
    • 2008.05.26 09:10
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2008.05.26 11:12
      질문이 잘 이해가 안가지만.. 아이템의 StateIndex 값을 조절 하시면 됩니다.
    • 한상훈
      2008.05.26 22:47
      예를들어 ListView1.SmallImages:=ImageList1; ListView1.StateImages:=ImageList1; 여기서 Imag...
    • 김병윤
      2008.05.25 01:16
      그냥 윈도우에 작업을 등록해서 사용하시면 될 듯 보이는데 굳이 델파이 코드로 등록을 해야할까요? 제...
    • steps
      2008.05.25 01:28
      앞으로의 배포문제를 념두에 두고 저에게 준 과제입니다. 사용자보고 인스탈후에 제어판의 scheduled ta...
    • 김병윤
      2008.05.25 02:08
      어차피 인스톨한 어플에서 등록을 하더라도 윈도우 스케줄러에 등록하려면 로그인 계정이 누구인지 알고...
    • steps
      2008.05.25 03:46
      당장은 가르쳐주신대로 콘솔호출방식을 리용하렵니다. http://www.Planet-Source-Code.com/vb/scripts/S...
    • 이정욱
      2008.05.25 09:09
      배포하시기에 더 좋은 방법은 그 어플리케이션을 서비스 형태로 만드셔서 특정시간에 쿼리를 수행하게 하...
    • 구창민
      2008.05.26 06:36
      안녕하세요..아래 내용을 참고 하세요... unit Unit1; interface uses Windows, Messages,...
    • steps
      2008.05.27 00:34
      이종욱님 구창민님 정말 감사합니다. 귀한 시간 내시여 래핑까지 해주신 창민님께 다시 한번 인사드립니다.
    • • • •
    • 이정욱
      2008.05.24 20:28
      Implementation 위쪽에 선언해주세요 ^^ 밑쪽에 있으면, 그 유닛 안에서만 참조가 가능합니다.
    • 이정욱
      2008.05.25 00:32
      BDE는 제가 오랫동안 안해서.. 기억이 하나도 나질 않네요.. 시간이 좀 있으시다면 ODAC 라는 써드파...
    • 강신구
    • 2008.05.23 23:13
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      2008.05.23 23:25
      안녕하세요.. 아래와 같이 설명되어 지구 있습니다.. ◇ DLL에서의 전역변수 DLL에서 선언된 전...
    • 강신구
      2008.05.23 23:36
      답변에 감사드립니다.. 한가지 더 문의 드리고 싶은데요.. 아래 설명에 따르면.. 제가 문의드린 내용...
    • 구창민
      2008.05.24 02:03
      음.. DLL 내의 전역변수를 쓰레드에서 다루어 본적이 없어서 ..쩝.. 간단한 문제가 아닌거 같네요.. ...
    • steps
      2008.05.24 00:05
      질문에 1번이 작업 종료후의 aaa 값을 리턴 받아 봤는데.. 값이 초기화 되어 있었습니다.. 라고 되여있...
    • 김원기
    • 2008.05.23 00:11
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2008.05.23 08:40
      지금 열려 있는 코드들이 어디에 저장되어 있는지 확인해 보세요. 혹시라도 프로젝트를 카피해서 다른 ...
    • 머문자리
      2008.05.26 18:19
      흠.. 저도 소스를 복사해서 업데이트 하다가 원본실행파일만 실행시킨 어처구니 없는 일들이 기억이 나네...
    • 김원기
      2008.06.18 20:13
      감사 해요. 감사 합니다. 이제야 감사하다는 말을 남기네요 ㅠㅠ 바뻐서.. 나중에 남긴다는 말을.....