* 출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=549748&ref=549748




=============================================================================================

▲ 질문내용

 

1. 우선 %p 와 %x의 차이점이 무엇인지 알고 싶네요.

 

     %p도 16진수로 표현 %x도 16진수로 표현. 같은 용도인데 왜 따로 사용하는 사례가 있을까요?

     다른점이 있다면 %p는 빈공간에 0을 넣어서 출력하며 대문자더군요.

     (8자리 출력인 것 보면 주소 값 출력과도 관계가 있는 것 같은데요 ㅠㅠ)

 

2.  출력명령문의 #는 무엇을 하는 녀석입니까?

 

     그리고 #을 사용하게 되면

     0x라는 값이 출력됩니다. 0x는 도대체 뭔지요 ㅠ_ㅠ; 16진수일 때만 나오는군요.

 

▲ 소스

 

main()

{

    int a = 100;

 

// 1. %x#사용 a변수의 주소를 16진수로 표현(10자리로 표현하며 빈공간에는 0을 넣어라)

    

    printf("%#010x\n", &a);

 

// 2. %x사용 a변수의 주소를 16진수로 표현   

 

    printf("%x\n", &a);

 

// 3. %x사용 a변수의 값을 16진수로 표현

 

    printf("%x\n", a);

 

// 4. %p사용 a변수의 주소를 16진수로 표현

 

    printf("%p\n", &a);

 

// 5. %p사용 a변수의 값을 16진수로 표현

 

    printf("%p\n", a);

}

 

결과값

 

1. 0x0012ff7c                     <---- %x 와 #사용. 주소 10자리로 출력 빈공간에는 0을 넣었음.

2. 12ff7c                           <---- %x 를 사용 주소 출력.

3. 64                                <---- %x 를 사용 값 출력.

4. 0012FF7C                     <----- %p 를 사용 주소 출력.

5. 00000064                       <---- %p 를 사용 값 출력.



=============================================================================================


%x 에서 %#x 는 0x 를 붙이라는 뜻이구요, (사용하는 사람이 많지는 않은듯 하네요)

%p 는 포인터 크기 만큼 메모리를 읽어서, 16진수로 표시합니다.

 

아래는 MSDN 에서 뽑아왔습니다.

 

%[flags] [width] [.precision] [{h | l | I | I32 | I64}]type

flags : '-', '+', '0', ' ', '#'

    '-' : 오른쪽 정렬

    '+' : 부호 붙임 (- 또는 +)

    '0' : 앞자리에 0 을 붙임

    ' ' : 앞자리에 공백출력

    '#' : o,x,X 와 같이 쓰일경우 진수 표시. (0, 0x, 0X)

          e,E,f,g,G 와 같이 쓰일 경우 소수점 아래 무조건 표시

width : 전체 길이

.precision : 정밀도.. 일반적으로 f 와 같이 쓰이나, s 와 같이 쓰일경우 길이를 강제로 맞출때 사용. d,x 등 기타 다른 플래그도 동일.

    ex: printf("%.5s", "abcdefghijklmn"); --> "abcde" 만 찍힘. (지원안되는 컴파일러도 있음)

h,l,I,I32,I64 :

    h : short 크기만 읽음

    l : long 크기

    I : int 크기

    I32 : 4 바이트 크기 강제

    I64 : 8 바이트 크기 강제

        w : 2byte character

 

type : d,f,x.p... 등 타입은 다 알고 계실거구요...


 


회사일로 우연히 OCI 함수 개발하게 된 나....

무신 OCI 관련 개발 내용이 이리 많은겨...

첨 접해본 것이라 너무나도 정신없고 개발하기도 힘들어... ㅡㅡ;;

다행히도 참고 사이트에서 뒤져보니  아래 사이트 찾게됨... 감솨드림... ^-^


# 참고 사이트
ProC보다 쉬운 OCCI(Oracle C++ Call Interface) 프로그래밍 : OCI, OCCI 관련 개념 잡기...

http://download.oracle.com/docs/cd/B14117_01/appdev.101/b10779/toc.htm  : 레퍼런스 사이트...

http://lists.suse.com/archive/suse-oracle/2000-Mar/0106.html : 초보인 내가 볼만한 예제와 자료...
-> 첨부파일 있음...

Active-X  컨트롤에 Safe 옵션을 추가하는 방법은 컨트롤이 인스톨 되거나 그 후에  Certains function을 컨트롤이 직접 호출하는 방법과 그 컨트롤에 직접 IObjectSafety 인터페이스를 직접구현하는 방법 두가지가 있습니다.




1. << 레지스터에 등록하는 동안 컨트롤을 마크하는 방법 >>





2. << IobjectSafety 인터페이스를 구현하는 방법 >>




 

출처 - http://www.madchick.com/Default.asp?Page=2&SubPage=2&3thPage=1
주  제 : ActiveX 컨트롤에서의 IObjectSafety 인터페이스 구현


helpers.h 입니다.

 

// Helpers.h : Declarations of object safety category helper functions

 

#include "comcat.h"

 

HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription);

HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid);

 

 

helpers.cpp 입니다.

 

// Helpers.cpp : Implementation of of object safety category helper functions

// Copied from ActiveX SDK

 

#include "stdafx.h"

 

#include "helpers.h"

 

/////////////////////////////////////////////////////////////////////////////

// CreateComponentCategory - Ensures component category exists in registry

// (Copied from ActiveX SDK docs)

 

HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)

{

 

    ICatRegister* pcr = NULL ;  // interface pointer

    HRESULT hr = S_OK ;

 

    hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,

            NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);

    if (FAILED(hr))

        return hr;

 

    // Make sure the HKCR\Component Categories\{..catid...}

    // key is registered

    CATEGORYINFO catinfo;

    catinfo.catid = catid;

    catinfo.lcid = 0x0409 ; // english

 

    // Make sure the provided description is not too long.

    // Only copy the first 127 characters if it is

    int len = wcslen(catDescription);

    if (len>127)

        len = 127;

    wcsncpy(catinfo.szDescription, catDescription, len);

    // Make sure the description is null terminated

    catinfo.szDescription[len] = '\0';

 

    hr = pcr->RegisterCategories(1, &catinfo);

    pcr->Release();

 

    return hr;

}

 

 

 

/////////////////////////////////////////////////////////////////////////////

// RegisterCLSIDInCategory - Registers class clsid as implementing category catid

// (Copied from ActiveX SDK docs)

 

HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)

{

// Register your component categories information.

    ICatRegister* pcr = NULL ;

    HRESULT hr = S_OK ;

    hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,

            NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);

    if (SUCCEEDED(hr))

    {

       // Register this category as being "implemented" by

       // the class.

       CATID rgcatid[1] ;

       rgcatid[0] = catid;

       hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);

    }

 

    if (pcr != NULL)

        pcr->Release();

  

    return hr;

}

 

<OBJECT id=ns classid="clsid:0848EBD0-1368-4F1B-A9F4-43571D152ACD" width='600' height='150' >
    <PARAM NAME='UserID'  VALUE='11'>
    <PARAM NAME='UserPW'  VALUE='11'>
</OBJECT>

 웹페이지에서 시작시 아이디,패스워드를 주어서 ActiveX에서 아큐먼트로 받고 싶은데??


* 멤버변수로 사용하는 경우

    1. ctrl + w 를 눌러서 클래스위저드를 띄운다..

    2. automation 탭에서 Add Property 버튼 클릭..

    3. implementation은 Member variable 선택,
       사용할 이름 입력, 데이터형 선택 OK 클릭..
  
       예) sUserName 을 입력하고, CString을 선택
           했다고 하죠..
  
    4. DoPropExchange 함수에
       PX_String(pPX, _T("sUserName"), m_sUserName) ;
       라고 입력..
  
    5. HTML 혹은 ASP 파일에서
       object 태그 사이에
       param name="sUserName" value="오광섭" 추가..
  

* Get/Set 메쏘드를 사용하는 경우

    1. ctrl + w 를 눌러서 클래스위저드를 띄운다..

    2. automation 탭에서 Add Property 버튼 클릭..

    3. implementation은 Member variable 선택
       사용할 이름 입력, 데이터형 선택 OK 클릭..
  
       예) sNickName 을 입력하고, BSTR을 선택
           했다고 하죠..
      
    5. CString m_sNickName ; 선언
  
    6. DoPropExchange 함수에
       PX_String(pPX, _T("sNickName"), m_sNickName) ;
       라고 입력..
      
    7. Get/Set 메쏘드에 코딩 추가..
   
           BSTR CTestCtrl::GetSNickName()
           {
               CString strResult;
               // TODO: Add your property handler here
               strResult = m_sNickName ;

               return strResult.AllocSysString();
           }

           void CTestCtrl::SetSNickName(LPCTSTR lpszNewValue)
           {
               // TODO: Add your property handler here
               m_sNickName = lpszNewValue ;

               SetModifiedFlag();
           }
  
    8. HTML 혹은 ASP 파일에서
       object 태그 사이에
       param name="sNickName" value="미친병아리" 추가..



MFC ActiveX에서 PARAM 가능하게 하기
======================================================
MFC에서 프로퍼티를 만든 후

VARIANT COMXCtrl::GetSOMDIP()
{
        _variant_t vVal( m_Env.sOMDIP );
        // SysAllocString 된 것을 삭제하지 않고 그냥 넘겨주어야 한다.
        return vVal.Detach();
}

void COMXCtrl::SetSOMDIP(const VARIANT FAR& newValue)
{
        // TODO: Add your property handler here
        m_Env.sOMDIP = (LPCTSTR)_bstr_t( _variant_t( newValue ) ) ;
        SetModifiedFlag();
}

VARIANT COMXCtrl::GetNOMDPort()
{
        _variant_t vVal( m_Env.nOMDPort );
        return vVal.Detach();
}

void COMXCtrl::SetNOMDPort(const VARIANT FAR& newValue)
{
        // TODO: Add your property handler here
        m_Env.nOMDPort = _variant_t( newValue );
        SetModifiedFlag();
}

...
아래처럼 프로퍼티 변환 함수에 해당 프로퍼티에 대한것을
기입한다.


void COMXCtrl::DoPropExchange(CPropExchange* pPX)
{
        ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
        COleControl::DoPropExchange(pPX);

        // TODO: Call PX_ functions for each persistent custom property.
        if (pPX->GetVersion() == (DWORD)MAKELONG(_wVerMinor, _wVerMajor))
        {
                PX_String(pPX,_T("sOMDIP"), m_Env.sOMDIP );
                PX_Long(pPX,_T("nOMDPort"), m_Env.nOMDPort );
                PX_String(pPX,_T("sGroupDIP"), m_Env.sGroupDIP );
                PX_Long(pPX,_T("nGroupDPort"), m_Env.nGroupDPort );
                PX_String(pPX,_T("sSiteID"), m_Env.sSiteID );
                PX_String(pPX,_T("sServerID"), m_Env.sServerID );
                PX_String(pPX,_T("sUserID"), m_Env.sUserID );
                PX_String(pPX,_T("sPasswd"), m_Env.sPasswd );
        }

}



그렇게 하면 아래처럼 웹페이지에서 쓸 수 있게 된다.

<TD>
  <object id=omx width=400 height=500
   classid="clsid:6D2A9FCF-749F-4648-A8C8-F16300DE6FF5"
   codebase="http://localhost/ActiveApproval/ActiveApproval.cab#version=1.0.1.7"
  >
    <PARAM NAME="sOMDIP" VALUE="61.37.47.62">
    <PARAM name="nOMDPort" value="9204">
    <PARAM name="sGroupDIP" value="61.37.47.62">
    <PARAM name="nGroupDPort" value="9203">
    <PARAM name="sSiteID" value="intracool">
    <PARAM name="sServerID" value="jiran">
    <PARAM name="sUserID" value="bro">
    <PARAM name="sPasswd" value="1111">
  </object>
</TD>

출처 : http://neri.cafe24.com/menu/bbs/view.php?id=kb&page=2&sn1=&divpage=1&sn=off&ss=on&sc=on&keyword=PARAM&select_arrange=headnum&desc=asc&no=191

+ Recent posts