2010년 2월 25일 목요일

MacAddress 가져오기

int GetMacAddress(char *macaddress)

{

    ASTAT Adapter;

 

    NCB Ncb;

    UCHAR uRetCode;     

    LANA_ENUM   lenum;

    int      i;

 

    memset( &Ncb, 0, sizeof(Ncb) );

    Ncb.ncb_command = NCBENUM;

    Ncb.ncb_buffer = (UCHAR *)&lenum;

    Ncb.ncb_length = sizeof(lenum);

    uRetCode = Netbios( &Ncb );

    //loging( "The NCBENUM return code is: 0x%x \n", uRetCode );

 

    for(i=0; i < lenum.length ;i++)

    {

        memset( &Ncb, 0, sizeof(Ncb) );

        Ncb.ncb_command = NCBRESET;

        Ncb.ncb_lana_num = lenum.lana[i];

 

        uRetCode = Netbios( &Ncb );

        //loging( "The NCBRESET on LANA %d return code is: 0x%x \n",

          // lenum.lana[i], uRetCode );

 

        memset( &Ncb, 0, sizeof (Ncb) );

        Ncb.ncb_command = NCBASTAT;

        Ncb.ncb_lana_num = lenum.lana[i];

 

        unsigned char aa[16] = "*              ";

        memcpy(Ncb.ncb_callname , aa , 16);        

        Ncb.ncb_buffer = (unsigned char *) &Adapter;

        Ncb.ncb_length = sizeof(Adapter);

 

        uRetCode = Netbios( &Ncb );

        //loging( "The NCBASTAT on LANA %d return code is: 0x%x \n",

        //lenum.lana[i], uRetCode );

        if ( uRetCode == 0 )

        {

            sprintf(macaddress, "%02x%02x%02x%02x%02x%02x",

                                Adapter.adapt.adapter_address[0],

                                Adapter.adapt.adapter_address[1],

                                Adapter.adapt.adapter_address[2],

                                Adapter.adapt.adapter_address[3],

                                Adapter.adapt.adapter_address[4],

                                Adapter.adapt.adapter_address[5]);

             return 1;

         }

    }

    return 0;

}

[출처] vc++ macadress 얻어오기 데브피아 펌|작성자 하나

 

2010년 2월 17일 수요일

메모리 leaks

 

수많은 메모리 leaks

 

버전이 다른 DLL을 참조함으로 생기는 leaks 란다.

 

The most common case is mixing ANSI (MFC4xd.DLL) and UNICODE (MFC4xxUd.DLL) versions of MFC in the same process. This can also occur when mixing MFC42d.DLL and MFC40d.DLL.

 

그냥 무시하란다..

 

Memory leaks are reported when you use multiple MFC DLLs

 

   a CDynLinkLibrary object at $00410F70, 64 bytes long
   a CDynLinkLibrary object at $00410F70, 64 bytes long
   {38} client block at 0x00410D80, subtype 0, 64 bytes long.
   a CDynLinkLibrary object at $00410D80, 64 bytes long
   a CDynLinkLibrary object at $00410D80, 64 bytes long
   {36} client block at 0x00410C60, subtype 0, 64 bytes long.
   a CDynLinkLibrary object at $00410C60, 64 bytes long
   a CDynLinkLibrary object at $00410C60, 64 bytes long
   

 

다름을 이용해서 메모리를 잡으란다.

아래 Trace 다음에 나오는 것만 잡으면 된단다..

 

   int CTestDllApp::ExitInstance()
   {
      TRACE(_T("ExitInstance() for regular DLL: TESTDLL\n"));

      return CWinApp::ExitInstance();
   }

 

출처 : http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B167929

GDI+ 사용

Windows XP에서 지원하는 GDI+

Link : gdiplus.lib

 

사용하는 곳에 초기 선언

#include <gdiplus.h>

using namespace Gdiplus;

 

class GdiplusTest

{

   GdiplusTest;

   ~GdiplusTest;

private:

    ULONG_PTR m_gdiplusPTR;

}

 

GdiplusTest::GdiplusTest

{

   GdiplusStartupInput gdipluse;
   GdiplusStartup(&m_gdiplusPTR, &gdipluse, NULL);

}

GdiplusTest::~GdiplusTest

{

   GdiplusShutdown(m_gdiplusPTR);

}

 

void GdiplusTest::Draw()

{

   CDC *pDC;

   pDC = GetDC();

   RectF rectTemp;

 

   Graphics graphics(pDC);
   Pen pen(Color(255, 0, 0), 1);

   graphics.SetPageUnit(UnitPixel);
   graphics.DrawEllipse(&pen, rectTemp);

   ReleaseDC(pDC);

}

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

레지스트리 등록

프로그램의 실행경로를 아는 방법에는
1. 프로그램이 실행되면서 자신의 경로를 레지스트에 등록한다.
2. GetModuleHandle함수를 사용한다.
3. 기타

여기서는 2번째 방법을 설명하고 있습니다.

필요할때 사용하세요

CString getAppPath()
{
HMODULE hModule;
hModule = ::GetModuleHandle(NULL); // handle of current module
ASSERT(hModule != 0);

CString strExeFileName;
VERIFY(::GetModuleFileName(hModule, strExeFileName.GetBuffer(_MAX_PATH),
_MAX_PATH));
strExeFileName.ReleaseBuffer();

char Drive[_MAX_DRIVE];
char Path[_MAX_PATH];
char Filename[_MAX_FNAME];
char Ext[_MAX_EXT];
_splitpath(strExeFileName, Drive, Path, Filename, Ext);

return CString(Drive)+CString(Path); // has trailing backslash
}

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

stl map 사용

struct ltstr
{
bool operator()(const char* s1, const char* s2) const
{
return strcmp(s1, s2) < 0;
}
};

int main()
{
map months;
/// 또는 months.insert
months["january"] = 31;
months["february"] = 28;
months["march"] = 31;
months["april"] = 30;
months["may"] = 31;
months["june"] = 30;
months["july"] = 31;
months["august"] = 31;
months["september"] = 30;
months["october"] = 31;
months["november"] = 30;
months["december"] = 31;

cout << "june -> " << months["june"] << endl;
map::iterator cur = months.find("june");
map::iterator prev = cur;
map::iterator next = cur;
++next;
--prev;
cout << "Previous (in alphabetical order) is " << (*prev).first << endl;
cout << "Next (in alphabetical order) is " << (*next).first << endl;
}

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

화면좌표에 Windows 위치 설정

CRect Screen;
SystemParametersInfo(SPI_GETWORKAREA,0,&Screen,0);
Screen.NormalizeRect();
Scalex=Screen.Width();
Scaley=Screen.Height();

#2
CClientDC dc(AfxGetMainWnd());
int H, W;
H = GetDeviceCaps(dc, VERTRES);
W = GetDeviceCaps(dc, HORZRES);


#3
// WINDOWPLACEMENT structure
WINDOWPLACEMENT wp; // Get dialog window placement
AfxGetMainWnd()->GetWindowPlacement(&wp); // Increment bottom section of dialog
wp.rcNormalPosition.bottom += 100; // Set dialog's new window placement
AfxGetMainWnd()->SetWindowPlacement(&wp);


#4
CRgn crgn;
RECT r;
AfxGetMainWnd()->GetWindowRect(&r);
r.bottom = r.bottom*2; // souble the 'length' of the dialog
crgn.SetRectRgn(&r);
AfxGetMainWnd()->SetWindowRgn((HRGN)crgn, TRUE);

#5
RECT r;
AfxGetMainWnd()->GetWindowRect(&r);
r.bottom = r.bottom*2; // double the 'length' of the dialog
MoveWindow(&r);

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

프로세스 강제 종료

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

   본 팁&트릭은 EnjoyDEV.NET에서 나온 것이며 재배포시 이 문구는 포함시켜주시기 바랍니다.

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

 

Script를 사용하여 만들었습니다.

프로젝트->참조에서 Microsoft Scripting Runtime 을 추가하시면 됩니다.

이 참조파일(Scrrun.dll)은 시스템 파일이기 때문에 모든 OS에 존재하는 파일이니 따로 배포할 필요가

없습니다.

 

Public Sub KillProcess(PName As String)
'--------------------------------------------------------------------------------------------
'만든사람: 신종흔(chiuoo@enjoyev.net)
'만든날짜: 2007.03.22
'사용법: KillProcess([실행파일명])
'        --> 실행파일명은 작업관리자->프로세스탭에서 이미지 이름에 해당하는 이름과 동일
'--------------------------------------------------------------------------------------------
    Dim pgm As String
    Dim wmi As Object
    Dim processes, process
    Dim sQuery As String
   
    pgm = PName
    Set wmi = GetObject("winmgmts:")
    sQuery = "select * from win32_process where name='" & pgm & "'"
    Set processes = wmi.execquery(sQuery)
   
    For Each process In processes
        process.Terminate
    Next
   
    Set wmi = Nothing
End Sub

 

출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=48&MAEULNO=19&no=3332

프로세스 강제 종료

OpenProcess 디버그권한 문제 발생

해결은 아래쪽 검토

 

bool ProcessKill(CString strProcessName)

{

    HANDLE         hProcessSnap = NULL;

    BOOL           bRet      = FALSE;

    PROCESSENTRY32 pe32      = {0};

 

    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

 

    if (hProcessSnap == (HANDLE)-1)

        return false;

 

    pe32.dwSize = sizeof(PROCESSENTRY32);

   

    //프로세스가 메모리상에 있으면 첫번째 프로세스를 얻는다

    if (Process32First(hProcessSnap, &pe32))

    {

        BOOL          bCurrent = FALSE;

        MODULEENTRY32 me32       = {0};

 

        do

        {

           bCurrent = GetProcessModule(pe32.th32ProcessID,strProcessName);

 

           if(bCurrent)

           {

              HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);

 

              if(hProcess)

              {

                 if(TerminateProcess(hProcess, 0))

                 {

                    unsigned long nCode; //프로세스 종료 상태

                    GetExitCodeProcess(hProcess, &nCode);

                 }

                 CloseHandle(hProcess);

              }

           }

        }

        while (Process32Next(hProcessSnap, &pe32)); //다음 프로세스의 정보를 구하여 있으면 루프를 돈다.

    }

 

    CloseHandle (hProcessSnap);

 

    return true;

}

 

bool GetProcessModule(DWORD dwPID,CString sProcessName)

{

    HANDLE        hModuleSnap = NULL;

    MODULEENTRY32 me32        = {0};

 

    hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);

    if (hModuleSnap == (HANDLE)-1)

        return (FALSE);

 

    me32.dwSize = sizeof(MODULEENTRY32);

   

    //해당 프로세스의 모듈리스트를 루프로 돌려서 프로세스이름과 동일하면

    //true를 리턴한다.

    if(Module32First(hModuleSnap, &me32))

    {

       do

       {

          if(me32.szModule == sProcessName)

          {

             CloseHandle (hModuleSnap);

             return true;

          }

       }

       while(Module32Next(hModuleSnap, &me32));

    }

 

    CloseHandle (hModuleSnap);

 

    return false;

}

 

여기에 디버그권한 에서는 실행되고 .exe를 바로 실행 했을 때는 프로세스를 못가져 오는 현상이 있다 ㅡ.ㅡ 프로세스 권한 문제라는데..

 

OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);

이내용을 PROCESS_ALL_ACCESS=>MAXIMUM_ALLOWED 이걸로 변경해 사용하면 된다.

 

 

출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNO=20&no=7057

2010년 2월 12일 금요일

DCom connetor 사용 Dll 생성



SAP 에서 RFC 통신을 위해 DCom connetor를 사용하는데

 

그 사용법을 정리한다.

 

DCOMConnector 610 프로그램을 설치한다.

주의 : DCom connector은 SAP 640 이전버전에서 정상 작동한다.

 

프로그램을 설치하면 다음과 같은 메뉴가 생성된다.

 

 

메뉴 중 SAP DCOM Connector를 선택한다.

 

 

DCom을 생성하기 위해서는 실행된 프로그램의 왼쪽 트리에 있는 Object Bulider를 선택한다.

 

 



이제 DCom을 생성할 Function 이 있는 SAP 에 접속할 것이다.

실행된 프로그램의 오른쪽 화면을 보면 "Lonon... " 이라는 버튼이 보인다.

 

SAP 에 접속하는 Destination, Client, User, Password, Language를 입력하여 Log On 한다.


로그온에 성공하면



LogOn 버튼이 사라지고 Connected To : 내용에 접속된 서버 이름이 표시된다.

 

RFC 통신용 DCom을 생성해야 하기 때문에 아래 부분 라이도 버튼에 RFC Functions을 선택한다.

 



DCom 으로 작성할 Function 이름을 All 라이도 버튼을 선택하여 OK 버튼을 눌러 찾는다.

Function을 찾으면 아래와 같이 리스트에 찾은 Function 이름이 표시된다.





Add 버튼을 선택하여 왼쪽리스트 내용을 오른쪽리스트에 추가한다.

만약에 추가할 Function이 더 있으면 Select RFC Functions 버튼을 선택하여

 

위의 Function Dlg 창을 이용 선택 추가하면 된다.

 

처음 Function을 추가할때 ADD 버튼을 누르면 Dcom으로 생성할 Class 이름을 넣어야 한다.

 

Class 이름은 생성한 Dll 이름이 되기때문에 작성할때 유의하여 작성해야한다.

이제 나머지 빈공간에 이름을 넣으면 된다.

 


C++ Project : 생성할 프로젝트 이름

Target Dll : Project 이름을 넣으면 자동으로 입력

Namespace : Dll을 생성하면 Function의 위치가 저장되게 되는데 기본적으로 접속한 서버 이름으로 설정

MTS Package : DCom을 생성방법 선택 "SAP R/3 DCom Connector Object Builder" 선택

이제 마지막 단계로


 이제 "Buildd Component Dll" 버튼을 선택한다.

 

지정된 폴터에 Dll 이 생성되었음을 확인하고

 

생성된 DLL을 사용할 서버의 구성요소 서버스에 등록하면 끝..

 

출처 : Tong - 공원님의 ┣ ★ 알아두면 편리한 것통

실행창에서 윈격데스크탑 열기

실행창에서 원격데스크탑 열기

 

Console 모드로 열면 PC에서 직접 실행한 화면으로 작업이 가능

 

"IP" : 이곳에 연결하고자 하는 서버의 IP 입력

 

mstsc /v: "IP" /console

출처 : Tong - 공원님의 ┣ ★ 알아두면 편리한 것통

작업 관리자 열기

Ctrl+Alt+Del 키를 눌렀을 경우 실행 되는

 

작업 관리자 창을 열어주는 명령은 "Taskmgr.exe"

 

이다. System32 폴더에서 cmd를 실행하고 바로 실행하면 OK

출처 : Tong - 공원님의 ┣ ★ 알아두면 편리한 것통

sql Injection 처리

특정 문자를 검색하여 SQL에 치명적인 오류를 발생하는 문자일 경우

사용을 금지한다.

 

function checkSqlInjection(strData)

   dim CheckArray

   dim Checkdata

   CheckArray = Array("'or", "' or", "or'", "or '", "like'", "like '", "union ", " from ", "delete ", "insert ", "update ", "select ", "xp_cmdshell", "exec ", "master")

   checkSqlInjection="Y"

   for i=0 to ubound(CheckArray )

       Checkdata=0

       Checkdata=instr(strData, CheckArray(i))

       if CheckData>0 then

           checkSqlInjection = "N"

           exit function

       end if

   next

end function

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

web 에서 DB 입력 특수문자 처리

Web 에서 DB로 insert 할때 특수 문자 오류가 발생하는 경우가 많다.

 

그래서 기본적인 특수 문자는 변환하여 입력한다.

 

 Function ConvertChar(strValue)

   strValue = trim(strValue)

   strValue = Replace(strValue, "&", "&")

   strValue = Replace(strValue, "<", "<")

   strValue = Replace(strValue, ">", ">")

   strValue = Replace(strValue, "'", "'")

   strValue = Replace(strValue, """", """)

   strValue = Replace(strValue, "|", "|")

   strValue = Replace(strValue, vbCrLf, "<br>")

   ConvertChar = strValue

End Function

<!-- 변경 -->

 

Function DeConvertChar(strValue)

   strValue = Replace(strValue, "&", "&")

   strValue = Replace(strValue, "<", "<")

   strValue = Replace(strValue, ">", ">")

   strValue = Replace(strValue, """, """")

   strValue = Replace(strValue, "'", "'")

   strValue = Replace(strValue, "|","|")

   strValue = Replace(strValue, "<br>",vbCrLf)

   DeConvertChar= strValue

End Function

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

parent 에 데이터 전송

parentpage.asp

 

<html>

<head>

<title>parentpage</title>

<script language="javascript" type="text/javascript">

<!--

   function callParentpage(nextdata)

   {

      if(nextdata == "")

        change.style.display = "";

      else

        change.style.display = "none";

   }

-->

</script>

</head>

<body>

   <div id=change style=postion:absolute; display:none;">

     <br>

      보여라

   </div>

 <iframe id=childpage name=childpage src=child.asp width=100 height=100 marginwidth=0 marginheight=0 scrolling=auto></iframe>

</body>

</html>

 

child.asp

<html>

<head>

<title>child page</title>

<script language="javascript" type="text/javascript">

<!--

   function Senddata(nextdata)

   {

       parent.callParentpage(nextdata);

   }

-->

</script>

</head>

<body onload=javascript:Senddata("")>

새로운 창에서 호출

</body>

</html>

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

include

#include file = "파일 경로/파일명"

 : 파일 전체를 화면에 표시한다.

Include 파일과 main 파일이 같은 딜렉토리 또는 하위 딜렉토리에 위치할때 사용한다.

 

 

#include virtual = "파일 경로/파일명"

 : 위 내용과 동일하나, 다른 딜렉토리 하위 딜렉토리가 아닌 곳에 파일이 위치할때 사용한다.

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

iframe 사용하기

iframe은 특정한 부분을 frame로 분리해서 전체 페이지 업로트 없이 iframe으로 정의된 페이지만

수정 변경하여 업데이트 할때 사용한다.

 

<%

 

%>

<script language="javascript" type="text/javascript">

<!--

   function update()

  {

      var sddata = "a";

      var sdstate = "b";

      poupdate.location.href = "./poupdate.asp?aaa="+sddata+"&bbb="+sdstate

  }

-->

</script>

 

 

<table width="500" border="0" cellspacing="0" cellpadding="0" style="cursor:hand; onclick="javascript:update();">

<tr>

<td> 여기는 업데이트 않함 </td>

<td> 여기는 이후에만 업데이트

<iframe id="po_tree" name="poupdate" src="./poupdate.asp" frameborder="0" width="300" height="200" marginwidth="0" marginheight="0" scrolling="auto"></iframe>

</td>

</tr>

</table>

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

RSS 가져오기 (HTML 가져오기)

요구사항

RSS를 지원 싸이트

 

' XML 생성

set xml = CreateObject("Msxml2.ServerXMLHTTP.3.0")
xml.open "GET", "지원하는 싸이트 경로", false
xml.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xml.send
res1 = xml.status
res = xml.responsetext

 

' 한글 깨지는 것을 방지한다.

Set responseStrm = CreateObject("ADODB.Stream")
responseStrm.Open
responseStrm.Position = 0
responseStrm.Type = 1
responseStrm.Write xml.responseBody
responseStrm.Position = 0
responseStrm.Type = 2
responseStrm.Charset = "euc-kr"
resultStr = responseStrm.ReadText
responseStrm.close
Set responseStrm = Nothing
Set xml = Nothing

' 가져온 데이터 확인

Wscript.Echo "데이터 확인"

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

ASP Error Check

Set objError = Server.GetLastError

Dim ASPError_Number
Dim ASPError_Source
Dim ASPError_Category
Dim ASPError_File
Dim ASPError_Line
Dim ASPError_Column
Dim ASPError_Description
Dim sErrMsg, sQuery

ASPError_Number = Hex(objError.Number)
ASPError_Source = Server.HTMLEncode(objError.Source)
ASPError_Category = objError.Category
ASPError_File = objError.File
ASPError_Line = objError.Line
ASPError_Column = objError.Column
ASPError_Description = objError.Description

 

 

On Error Resume Next
Call Object

If Err.Number <> 0 Then
 Response.Write "오류내용 : " & err.Description
 Response.End
End if

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

ASP 이용 XML Load

XML형식으로 전달되는 데이터 받기

 

<%

   Dim myXml, serverURL, Xadd, strcondition

   DIM DayTemp(3)

 

   set myXml = CreateObject("Microsoft.XMLDCOM")   ' XML 변수선언

   myXml.async = false

   myXml.setProperty "ServerHTTPRequest", True ' HTTP 경로

   serverURL = http://www.google.co.kr/ ' XML 파일 경로

 

   myXml.Load(serverURL)

 

   if myXml.parseError.errorCode <> 0 then  ' 데이터 Loading 확인

       response.write("ERROR")

   else

       set Xadd = myXml.documentElement.selectSingleNode("//current_conditions")  ' //current_conditions 노드 데이터 얻기

       strcondition = Xadd.selectSingleNode("condition").Attributes(0).text

      

   for i = 1 to 3
      Set Xadd = myXml.documentElement.selectSingleNode("//forecast_conditions["&i&"]")  ' //forecast_conditions["&i&"] 노드가 여러개일경우
      DayTemp(i) = Xadd.selectSingleNode("day_of_week").Attributes(0).text
   Next

 

   set Xadd = nothing

   set myXml = Nothing

%>

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

ActiveX 추가하기 (javascript)

ASP 에서 Activex를 사용하기 위해 Object 추가 필요

 

'** Object 생성

<OBJECT id=Actvie????? style="display;none"

codebase="CA?????.cab#version=1,0,0,1"

classid=clsid:F??????-????-????-????-??????????B VIEWASTEXT>

 

<PARAM NAME="_Version" VALUE="65536">

<PARAM NAME="_ExtentX" VALUE="2646"> '초기 Activex 위치

<PARAM NAME="_ExtentY" VALUE="2646">'초기 Activex 위치

<PARAM NAME="_StockProps" VALUE="0">


</OBJECT>

 

'** ActiveX에 파라미터를 넘긴다.

'** 각각의 파라미터는 정해진 형식으로 전송

<HTML>

<HEAD>

</HEAD>

<script language = "javascript">

function ActiveXShow()

{

      Actvie?????.setUrl = "www.????.com";

      Actvie?????.SetWindowRect("400", "4000");

      Actvie?????.Create();

}

</script>

<BODY Onload="javascript:ActiveXShow()" >
<P>Test</P>
<P>

</P>
</BODY>
</HTML>

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

VB Script DB 연결

VB Function으로 DB연결 관련된 내용을 구성하여 쉽게 dB 접근및 Query 전송 하기

 

'------------------- DBConnection.asp

 

<!--METADATA type="typelib" FILE="C:\program Files\Common Files\System\ado\msado15.dll"-->

 

Dim Conn

 

Function OpenDB()

     Dim SeverName, DatabaseName, strUserID, strUserPW

     SeverName = "DBIP:port"

     DatabaseName = "DBname"

     strUserID = "DBUser"

     strUserPW = "UserPW"

 

     Conn.ConnectionString = "provider=SQLOLEDB;Data Source=" & SeverName & ";Initial Catalog=" & DatabaseName & ";User Id=" & DBUser& ";Password=" & strUserPW

     Conn.ConnectionTimeout = 20
     Conn.Open
     Conn.BeginTrans()

End Function

 

Function CloseDB()

      If Conn.Errors.Count > 0 Then
               Conn.RollbackTrans()
      Else
               Conn.CommitTrans()
      End If

 

      If VarType(Conn) = vbString Then
              If Conn.state Then
                      Conn.Close
              End If
      End If

End Function

 

Function QuerySend(strConn, strQuery)

      Dim RecordSet

          On Error Resume Next

     Set RecordSet = Server.CreateObject("ADODB.RecordSet")
     RecordSet.Open strSql, strConn, 0, 1

     If RecordSet.bOF Or RecordSet.EOF Then
           dbQuery = ""
     Else
           dbQuery = RecordSet.GetRows
     End If

 

     RecordSet.Close
     Set RecordSet = Nothing

     If Err.number <> 0 Then
            Err.Clear

     End If

End Function

 

' ----------------------------- end

 

<!-- #include virtual="DBConnection.asp" //-->

 

<%

Dim rTData, strQuery, rRow

Call OpenDB()

setQuery = "Select *from Table"

rTData = QuerySend(Conn, strQuery)

 

Dim IndexLow, indexColl, nLow, nColl

nLow = UBound(rTData, 2)

nColl = UBound(rTData, 1)

 

Call CloseDB()


    if IsArray(rTData) Then

        for indexLow = 0 To nLow

            for indexColl = 0 To nColl

               Response.Write(RS_Tdata(indexColl, indexLow)

            NEXT

        NEXT

   End if

%>

 

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

java script 이용 객체 hidden

단순하게 객체(버튼 또는 Text box 등)을 보기/않보이기 기능

 

<html>
<head>
<title> Text Box Hidden </title>

<script language="JavaScript" type="text/JavaScript">
  <!--
        function SelectChange(arg1)
       {
            var form = document.formSearch;
            if(arg1 < "2")
            { 
                form.I_Sinpt.style.visibility = 'visible';
             }
            else
            {
             form.I_Sinpt.style.visibility = 'hidden';
             }
        }
   //-->
</script>
</head>
<body>
   Text box 숨기기
   <table border="0" align="center" cellpadding="0" cellspacing="0">
   <form name="formSearch" method="post">
     <tr>
       <td width="80">
          <select name="I_Sflag" class="tbox" onChange = "SelectChange(this.value);">
            <option value="1" >하나</option>
            <option value="2" >둘</option>
            <option value="3" >셋</option>
          </select>
       </td>
       <td width="20">
          <input name="I_Sinpt" type="text" class="tbox" size="20" value="" onkeypress="enter()">      
       </td>
     </tr>
   </form>
   </table>
</body>
</html>

 

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

File Down 받기

Client로 파일을 다운 받는다.

 

ASP(VB)

 

<!-- METADATA TYPE="typelib" FILE="C:\program Files\Common Files\System\ado\msado15.dll" -->

 

      Dim objFile, filename

      filename = "text.txt"

 

      Set objFile = Server.CreateObject("ADODB.Recordset") '결과 레코드셋 생성 '

      Response.contentType = "application/unknown"

      Response.AddHeader "Content-Disposition", "attachment; filename=" & filename

      Response.CacheControl = "public"

      Response.Write("확인") ' 파일에 쓰기

      Response.Write(" " & vbcrlf) ' Enter 입력

      set objFile = Nothing

 

파일 다운로드 또는 Open 창을 띄워 Client가 Down 받을수 있도록 한다.

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

CreateTextFile 을 이용한 File 처리

Web에서는 Client로 파일이 저장되는 것을 기본적으로 금지하고 있다.

 

그래서 Server 에서 파일을 생성하여 그 파일을 다시 Client로 다운 받는 방식을 사용하는데

 

CreateTextFile을 이용하여 파일을 생성하는 것을 알아본다.

 

CreateTextFile는 FileSystemObject 객체에 정의되어 있다.

 

CreateTextFile는 파일을 생성하여 저장한다.

 

사용 방법 (ASP_vb)

 

      Dim fileObj, fileCon

      Dim filename filename = server.MapPath("/testfile1.txt")

      Set fileObj = CreateObject("Scripting.FileSystemObject")

      Set fileCon = fileObj.CreateTextFile(filename, true) ' 줄을 씁니다.

 

      if fileObj.fileExists(filename) Then        ' 파일 생성여부 확인

           fileCon.Write ("테스트") ' 파일을 닫습니다.

           fileCon.WriteBlankLines ("테스트") ' 파일을 닫습니다.

           fileCon.WriteLine ("테스트") ' 파일을 닫습니다.

           fileCon.Close

      else

           '생성실패

      end if

 

CreateTextFile("파일 이름", "덥어쓰기 여부", "Unicode여부:기본 ASCII")

mapPath : server의 Web 서비스 위치

Write : File에 쓴다.

WriteBlankLines : Line을 띄운다.

WriteLine : File에 한 라인을 쓴다.

 

2010년 2월 10일 수요일

TCHAR => char* 유니코드

유니코드 일때

 

TCHAR szFileName[MAX_PATH];

 

/// 길이

int nLengs = (wcslen(szFileName)+1)*2;

 

char* chrTemp[MAX_PATH];

 

WideCharToMultiByte(CP_ACP, 0, szFileName, -1, (LPSTR)chrTemp, nLengs, NULL, NULL);

 

**** 출처

http://angelgrd.egloos.com/2142788