서비스 프로그램을-인터넷에서 발견한 내용

구글링 하다 검색한 내용인데  보관용 정리 해둠
서비스 프로그램이란
Linux 의 데몬처럼 Windows background 환경에서 작동하는 프로그램을 말합니다
Windows7 에서는 작업 관리자를 통해서 보거나
서비스 창을 통해서 확인하실수 있죠
먼저 서비스 프로그램을 돌리기 위해서는
자체적으로 돌아가는 서비스 프로그램과 이를 제어하기 위한 제어 프로그램이 필요합니다
서비스 프로그램은 Back Ground 에서 돌아가기 때문에 사용자와 상호 대화할 필요가 없죠
그래서 보통은 Console Application 으로 만들어지고
제어 프로그램은 이를 사용자가 제어하기 위해 만들어졌기 때문에
GUI 를 지니게 됩니다
또한, 서비스 프로그램은 직접 제어 프로그램과 통신하지 않고
SCM [ Service Control Manager ] 를 통해서 하게 됩니다
이때, SCM 과 서비스 프로그램과 통신을 담당하는 것을 ‘ Dispather ‘ 라고 하구요
전체적인 통신 방법을 살펴보자면..

  1. SCM은 해당 서비스를 가지고 있는 프로세스의 경로를 레지스트리에서 찾는다. 만약 이 프로세스가 실행중이 아니라면 프로세스를 실행시킨다.

 

  1. 서비스 프로세스의 Main 함수에서 디스패처 쓰레드를 생성하며, 이때 Main 은 디스패처에게 자신이 가지고 있는 서비스의 목록과 서비스 메인 함수의 시작 번지 등을 전달해 준다. 디스패처는 프로세스에 속한 서비스의 정보를 가지고 SCM 과 통신을 시작한다.

 

  1. 해당 서비스를 시작하기 위해 별도의 쓰레드를 생성하고, 서비스 메인 함수를 호출하여 서비스를 시작한다. 이때, 서비스 메인에서는 서비스를 위한 초기화와 핸들러 등록을 한다.

 

  1. 서비스는 실행중에 자신의 상태를 SCM에 보고 한다. 그리고 SCM으로 부터 제어 신호가 들어오면 디스패처가 이를 서비스의 핸들러에게 전달해주며, 핸들러가 이 제어 신호를 처리한다.

 

  1. 서비스가 종료되면 디스패처는 실행중인 서비스 카운터를 1 감소시키며, 0이면 디스패처도 종료되고 Main 함수로 리턴된다. 즉, 디스패처는 자신이 생성한 모든 서비스가 종료될  때까지 계속 무한 루프에서 대기하며 모든 서비스가 종료될 때 비로소 리턴한다.

뭐 이런 식입니다
그럼 구체적인 구현 방법을 볼까요?
먼저 서비스 프로그램 부터 봅시다
서비스 프로그램은 크게
Main 함수,  서비스 Main ,  핸들러
정도로 나뉩니다
이를 자세히 살펴보면
1. Main 함수
view plaincopy to clipboardprint?

  1. SERVICE_STATUS_HANDLE g_hSrv;
  2. DWORD g_NowState;
  3. BOOL g_bPause;
  4. HANDLE Exit_Event;
  5. void MyServiceMain(DWORD argc, LPTSTR *argv);
  6. void MyServiceHandler (DWORD opCode);
  7. int main(int argc, char* argv[])
  8. {
  9.     SERVICE_TABLE_ENTRY ste[] = {
  10.         {SRVNAME/*Service Name */,(LPSERVICE_MAIN_FUNCTION)MyServiceMain},
  11.         {NULL,NULL}
  12. };
  13. StartServiceCtrlDispatcher(ste);
  14.     return 0;
  15. }

상당히 간단하죠?
Main 함수는  디스패처 스레드를 실행시키는 일만을 맡고 있습니다
2.  서비스 Main 
view plaincopy to clipboardprint?

  1. void MyServiceMain(DWORD argc, LPTSTR *argv)
  2. {
  3.     g_hSrv = RegisterServiceCtrlHandler(“SVRNAME”,(LPHANDLER_FUNCTION)MyServiceHandler);
  4.     if ( g_hSrv ==0) {
  5.         return ;
  6.     }
  7.     MySetStatus(SERVICE_START_PENDING);
  8.     g_bPause = FALSE;
  9.     SerialPort a;
  10.     int res = 0;
  11.     while(a.Port_Scan());
  12.     MySetStatus ( SERVICE_RUNNING);
  13.     while(1){
  14.     if(g_bPause == FALSE){
  15.                 /* input code you want */
  16.     }
  17.     }
  18.     MySetStatus ( SERVICE_STOPPED);
  19.     }

실제 서비스 작업을 하는 서비스의 본체입니다
일단, 10초에 한번씩 실행하도록 코드를 짜두었습니다
저~ 기 중앙에 실행시키고자 하는 code를 집어넣으면 되구요
3. 핸들러
view plaincopy to clipboardprint?

  1. void MyServiceHandler (DWORD fdwControl)
  2. {
  3.     if(fdwControl == g_NowState)
  4.         return ;
  5.     switch(fdwControl){
  6.         case SERVICE_CONTROL_PAUSE:
  7.             MySetStatus ( SERVICE_PAUSE_PENDING,0);
  8.             g_bPause=TRUE;
  9.             MySetStatus ( SERVICE_PAUSED);
  10.             break;
  11.         case SERVICE_CONTROL_CONTINUE:
  12.             MySetStatus ( SERVICE_CONTINUE_PENDING,0);
  13.             g_bPause=FALSE;
  14.             MySetStatus ( SERVICE_RUNNING);
  15.             break;
  16.         case SERVICE_CONTROL_STOP:
  17.             MySetStatus ( SERVICE_STOP_PENDING,0);
  18.             SetEvent(Exit_Event[1]);
  19.             break;
  20.         case SERVICE_CONTROL_INTERROGATE:
  21.         default:
  22.             MySetStatus(g_NowState);
  23.             break;
  24.     }
  25. }

제어 프로그램에서 오는 신호를 처리합니다
여기서는 PAUSE, CONTINUE, STOP 의 처리를 해주었습니다
4. 상태제어 함수
view plaincopy to clipboardprint?

  1. void MySetStatus ( DWORD dwState, DWORD dwAccept = SERVICE_ACCEPT_STOP |
  2.                   SERVICE_ACCEPT_PAUSE_CONTINUE)
  3. {
  4.     SERVICE_STATUS ss;
  5.     ss.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
  6.     ss.dwCurrentState = dwState;
  7.     ss.dwControlsAccepted = dwAccept;
  8.     ss.dwWin32ExitCode = 0;
  9.     ss.dwServiceSpecificExitCode = 0;
  10.     ss.dwCheckPoint=0;
  11.     ss.dwWaitHint =0;
  12.     g_NowState = dwState;
  13.     SetServiceStatus (g_hSrv, &ss);
  14. }

현재 상태를 변경하는 역할을 맡고 있습니다
이번엔 서비스 제어 프로그램을 살퍼보겠습니다
서비스 제어 프로그램의 역할은 크게 2가지로 나눌 수 있습니다
설치/삭제와
제어 부분 입니다
2가지 프로그램으로 만들 수도 있겠습니다만,
괜히 여러프로그램을 만드는건 좀 아니죠
먼저 서비스 제어 프로그램의 전체적인 모습입니다
Install / Uninstall 로 서비스를 설치 / 제거 하고
설치가 되었다면 상태 제어를 할 수 있도록 짰습니다
1.Install 버튼
view plaincopy to clipboardprint?

  1. void CSvr_InsDlg::OnIns()
  2. {
  3.     char SrvPath[100];      //경로 저장
  4.     SERVICE_DESCRIPTION lpDes;  //설명 등록 변수
  5.     char Desc[1024];        //설명 저장
  6.     hScm = OpenSCManager ( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
  7.     if ( hScm == NULL)
  8.     {
  9.          MessageBox(“권한이 없습니다.”,”알림”,MB_OK);
  10.         return ;
  11.     }
  12.     GetCurrentDirectory( MAX_PATH, SrvPath);
  13.     strcat(SrvPath, “\\”);
  14.     strcat(SrvPath, EXENAME);
  15.     if( _access(SrvPath, 0) != 0 )
  16.     {
  17.         CloseServiceHandle(hScm);
  18.         MessageBox(“같은 디렉토리에 서비스 파일이 없습니다.”,”알림”,MB_OK);
  19.         return ;
  20.     }
  21.      hSrv = CreateService(
  22.        hScm,
  23.        SRVNAME, //서비스 고유 이름
  24.        DISPNAME,//”서비스의 외부 표시 이름”,
  25.        SERVICE_PAUSE_CONTINUE | SERVICE_CHANGE_CONFIG,
  26.        SERVICE_WIN32_OWN_PROCESS,
  27.        SERVICE_AUTO_START,
  28.        SERVICE_ERROR_IGNORE,
  29.        SrvPath,
  30.        NULL, NULL, NULL, NULL, NULL);
  31.    if(hSrv== NULL )
  32.        MessageBox(“설치하지 못했습니다.”,”알림”,MB_OK);
  33.    else
  34.    {
  35.        GetDlgItemText(IDC_DESC ,Desc, 1024);
  36.        lpDes.lpDescription = Desc;
  37.        ChangeServiceConfig2(hSrv, SERVICE_CONFIG_DESCRIPTION, &lpDes);
  38.        MessageBox(“설치했습니다.”, “알림”, MB_OK);
  39.       GetDlgItem(IDC_STATIC)->SetWindowText(“현재 상태 : 설치되어 있습니다”);
  40.        CloseServiceHandle(hSrv);
  41.    }
  42.                  CloseServiceHandle(hScm);
  43.     GetDlgItem(IDC_START)-> EnableWindow(TRUE);
  44.     GetDlgItem(IDC_INS)-> EnableWindow(FALSE);
  45.     GetDlgItem(IDC_UNINS)-> EnableWindow(TRUE);
  46. }

제어 프로그램과 같은 폴더에서 서비스 프로그램을 검색하고 있다면 설치합니다
여기서 EXENAME 은 설치될 서비스 프로그램의 파일명이구요
저기 에러 처리는 권한이 없을 때 보통 뜨더군요
다른 경우라면  define 을 잘못해준 경우겠죠?
2.Uninstall 버튼

view plaincopy to clipboardprint?

  1. void CSvr_InsDlg::OnUnins()
  2. {
  3.         hScm = OpenSCManager ( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
  4.         if( hScm == NULL)
  5.         {
  6.         MessageBox(“권한이 없습니다.”,”알림”,MB_OK);
  7.         return ;
  8.         }
  9.         hSrv = OpenService( hScm, SRVNAME, SERVICE_ALL_ACCESS);
  10.         if( hSrv == NULL ){
  11.         CloseServiceHandle(hScm);
  12.         MessageBox(“서비스가 설치되어 있지 않습니다”,”알림”,MB_OK);
  13.         return ;
  14.         }
  15.         QueryServiceStatus(hSrv, &ss);
  16.         if (ss.dwCurrentState != SERVICE_STOPPED){
  17.                 ControlService(hSrv, SERVICE_CONTROL_STOP, &ss);
  18.                 Sleep(2000);
  19.         }
  20.         if ( DeleteService ( hSrv ))
  21.         {
  22.             MessageBox(“서비스를 제거했습니다.” , “알림”, MB_OK);
  23.             GetDlgItem(IDC_STATIC)->SetWindowText(“현재 상태 : 설치되어 있지않습니다”);
  24.         }
  25.         else
  26.         {
  27.             MessageBox(“서비스를 제거하지못했습니다.” , “알림”, MB_OK);
  28.         }
  29.         CloseServiceHandle(hSrv);
  30.         CloseServiceHandle(hScm);
  31.         GetDlgItem(IDC_INS)-> EnableWindow(TRUE);
  32.         GetDlgItem(IDC_UNINS)-> EnableWindow(FALSE);
  33.         GetDlgItem(IDC_START)-> EnableWindow(FALSE);
  34.         GetDlgItem(IDC_STOP)-> EnableWindow(FALSE);
  35.         GetDlgItem(IDC_PAUSE)-> EnableWindow(FALSE);
  36.         GetDlgItem(IDC_CONTINUE)-> EnableWindow(FALSE);
  37. }

서비스를 제거합니다
3.Start 버튼
view plaincopy to clipboardprint?

  1. void CSvr_InsDlg::OnStart()
  2. {
  3.     hSrv = OpenService(hScm, SVRNAME, SERVICE_START | SERVICE_QUERY_STATUS);
  4.     if(hSrv == NULL)
  5.         AfxMessageBox(“권한이 없습니다”);
  6.     if( StartService (hSrv, 0, NULL) == TRUE) {
  7.         QueryServiceStatus(hSrv, &ss);
  8.         while (ss.dwCurrentState != SERVICE_RUNNING) {
  9.             Sleep(ss.dwWaitHint);
  10.             QueryServiceStatus(hSrv, &ss);
  11.         }
  12.     }
  13.     else
  14.     {
  15.         DWORD err=GetLastError();
  16.          CString msg;
  17.                          msg.Format(“The attempt to start service %s failed due to error: %d”,
  18.                     SRVNAME, err);
  19.         AfxMessageBox(msg);
  20.     }
  21.     CloseServiceHandle(hSrv);
  22.     QueryService();
  23. }

다른 버튼과는 다소 차이가 있는데 구조가 크게 다르진 않습니다
4. 나머지 버튼
view plaincopy to clipboardprint?

  1. void CSvr_InsDlg::OnStop()
  2. {
  3.     MemControl(SERVICE_CONTROL_STOP);
  4. }
  5. void CSvr_InsDlg::OnPause()
  6. {
  7.     MemControl(SERVICE_CONTROL_PAUSE);
  8. }
  9. void CSvr_InsDlg::OnContinue()
  10. {
  11.     MemControl(SERVICE_CONTROL_CONTINUE);
  12. }

간단하네요  각 버튼에 맞는 MemControl 을 호출합니다
5. MemControl
view plaincopy to clipboardprint?

  1. void CSvr_InsDlg::MemControl(DWORD dwControl)
  2. {
  3.     hSrv = OpenService( hScm, SRVNAME, GENERIC_EXECUTE);
  4.     if(hSrv == NULL)
  5.         AfxMessageBox(“권한이 없습니다”);
  6.     ControlService( hSrv, dwControl, &ss);
  7.     CloseServiceHandle(hSrv);
  8.     QueryService();
  9. }

서비스 프로그램에 각 상태를 전달합니다
6.  QueryService
view plaincopy to clipboardprint?

  1. void CSvr_InsDlg::MemControl(DWORD dwControl)
  2. {
  3.     hSrv = OpenService( hScm, SRVNAME, GENERIC_EXECUTE);
  4.     if(hSrv == NULL)
  5.         AfxMessageBox(“권한이 없습니다”);
  6.     ControlService( hSrv, dwControl, &ss);
  7.     CloseServiceHandle(hSrv);
  8.     QueryService();
  9. }

dwCurrentState 를 이용해 서비스 프로그램의 상태를 가져온다음에 이를 제어 프로그램
버튼 활성화/비활성화에 적용합니다
7. Timer
view plaincopy to clipboardprint?

  1. void CSvr_InsDlg::OnTimer(UINT nIDEvent)
  2. {
  3.     hScm = OpenSCManager ( NULL, NULL, GENERIC_READ);
  4.     if( hScm == NULL)
  5.     {
  6.         return;
  7.     }
  8.     hSrv = OpenService(hScm, SRVNAME , SERVICE_INTERROGATE);
  9.     if (hSrv ==NULL)
  10.     {
  11.         CloseServiceHandle(hScm);
  12.         return ;
  13.     }
  14.     do{       // 현재 상태를 받아온 뒤에.. Query Service 호출
  15.         ControlService( hSrv, SERVICE_CONTROL_INTERROGATE, &ss);
  16.     } while (( ss.dwCurrentState != SERVICE_STOPPED) &&
  17.         (ss.dwCurrentState != SERVICE_RUNNING ) &&
  18.         (ss.dwCurrentState != SERVICE_PAUSED ));
  19.     CloseServiceHandle(hSrv);
  20.        QueryService();
  21.     CDialog::OnTimer(nIDEvent);
  22. }

이는 제가 추가해준 부분이긴 한데, 아시다 시피 서비스 프로그램은 설치만 되면
서비스 제어 프로그램 외에도 관리도구에서도 쉽게 제어 할 수 있습니다
제어 프로그램은 서비스 프로그램으로 일방적으로 메시지를 보내서
서비스 프로그램의 상태를 실시간으로 받아올 수 없다는 단점이 있지요
그래서 이러한 Timer 함수를 만들어 두고 주기적으로 QueryService 를 호출해주면
실시간으로 반영이 된다는 것입니다
OnInitDialog 같은 함수에 Timer 를 셋팅해놓으면 되겠죠
8. OnInitDialog
view plaincopy to clipboardprint?

  1. BOOL CSvr_InsDlg::OnInitDialog()
  2. {
  3.     CDialog::OnInitDialog();
  4.         SetTimer(100, 3000, NULL);
  5.         DWORD cbBufSize;
  6.         DWORD dwBytesNeeded;
  7.         LPSERVICE_DESCRIPTION lpDes;
  8.         DWORD dwError;
  9.         hScm = OpenSCManager ( NULL, NULL, GENERIC_READ);
  10.         if( hScm == NULL)
  11.         {
  12.         MessageBox(“SCM을 열 수 없습니다.”,”알림”,MB_OK);
  13.         return TRUE;
  14.         }
  15.         hSrv = OpenService( hScm, SRVNAME,  GENERIC_READ);
  16.         if( hSrv == NULL )
  17.         {
  18.             GetDlgItem(IDC_STATIC)->SetWindowText(“현재 상태 : 설치되어 있지않습니다”);
  19.             GetDlgItem(IDC_UNINS)-> EnableWindow(FALSE);
  20.             GetDlgItem(IDC_START)-> EnableWindow(FALSE);
  21.             GetDlgItem(IDC_STOP)-> EnableWindow(FALSE);
  22.             GetDlgItem(IDC_PAUSE)-> EnableWindow(FALSE);
  23.             GetDlgItem(IDC_CONTINUE)-> EnableWindow(FALSE);
  24.             return TRUE;
  25.         }
  26.         else
  27.         {
  28.             GetDlgItem(IDC_STATIC)->SetWindowText(“현재 상태 : 설치되어 있습니다”);
  29.             GetDlgItem(IDC_INS)-> EnableWindow(FALSE);
  30.             GetDlgItem(IDC_UNINS)-> EnableWindow(TRUE);
  31.             if( !QueryServiceConfig2( hSrv, SERVICE_CONFIG_DESCRIPTION,  NULL, 0, &dwBytesNeeded))
  32.             {
  33.                 dwError = GetLastError();
  34.                 if( ERROR_INSUFFICIENT_BUFFER == dwError )
  35.                 {
  36.                     cbBufSize = dwBytesNeeded;
  37.                     lpDes = (LPSERVICE_DESCRIPTION) LocalAlloc(LMEM_FIXED, cbBufSize);
  38.                 }
  39.                 else
  40.                 {
  41.                     AfxMessageBox(“Error code Number: %d”,dwError);
  42.                     return TRUE;
  43.                 }
  44.             }
  45.             QueryServiceConfig2(hSrv,SERVICE_CONFIG_DESCRIPTION,(LPBYTE)lpDes, cbBufSize ,&dwBytesNeeded);
  46.             m_desc = lpDes->lpDescription;
  47.             GetDlgItem(IDC_DESC)->SetWindowText(m_desc);
  48.         }
  49.         CloseServiceHandle(hSrv);
  50.         QueryService();
  51.         return TRUE;
  52. }

처음에 Dialog 가 실행이 되면서 설치/비 설치 여부를 판단하고
설치 되었으면 기존의 서비스 프로그램의 설명 부분을 가져옵니다
이렇게 대략적인 서비스 프로그램의 설명은 끝났습니다
실험해본 결과  서비스 설치/ 삭제/ 시작 모두 ‘관리자 계정’ 일 때만 올바르게 작동합니다
일단 관리자 계정으로 설치하고 시작하면 ‘사용자 계정’은 그 서비스에 터치를 못한다는 거죠
또한 windows 7 의 경우는 관리자 계정에서도 ‘관리자 권한으로 실행’ 으로 해주실 때 올바르게 작동 한다는거~
이점 유의하시길 바랍니다 😀
출처: http://linkc.tistory.com/104 [Hack My Mind]

“서비스 프로그램을-인터넷에서 발견한 내용”의 41개의 댓글

  1. Howdy! I realize this is sort of off-topic
    however I needed to ask. Does running a well-established website
    such as yours require a lot of work? I’m completely new
    to running a blog but I do write in my journal on a daily basis.
    I’d like to start a blog so I will be able to
    share my own experience and views online. Please let me know if you have
    any recommendations or tips for new aspiring bloggers. Thankyou!

  2. Just desire to say your article is as surprising.
    The clearness in your post is simply great and i could assume you are an expert on this
    subject. Fine with your permission let me to grab your RSS
    feed to keep updated with forthcoming post. Thanks a million and please carry on the rewarding work.

  3. I’m not sure where you are getting your info,
    but great topic. I needs to spend some time learning more or
    understanding more. Thanks for fantastic info I was looking for this info for my mission.

  4. Cbd oil that works 2020
    Great goods from you, man. I’ve understand your stuff previous
    to and you are just extremely fantastic. I really like what you have acquired here, certainly like what you’re saying and the way in which you say it.
    You make it entertaining and you still take care of to keep it wise.
    I can’t wait to read much more from you. This is actually a wonderful site.

    best cbd oil for pain http://tinyurl.com/cbd-oil-that-works-2020 cbd oil that
    works 2020 http://tinyurl.com/cbd-oil-that-works-2020

  5. First of all I would like to say superb blog! I had a quick question in which I’d like to ask if you don’t mind.
    I was interested to find out how you center yourself and clear
    your mind before writing. I have had a hard time clearing my mind in getting my thoughts out there.
    I truly do enjoy writing but it just seems like the first 10 to
    15 minutes tend to be wasted simply just trying to figure out how to begin.
    Any suggestions or tips? Cheers!

  6. I simply want to mention I am just newbie to blogging and site-building and truly liked this website. Most likely I’m going to bookmark your blog post . You really have tremendous writings. Cheers for sharing your blog.

  7. An intriguing discussion deserves comment. I believe that you must create much more on this subject, it may not be a taboo subject yet generally individuals are not nearly enough to talk on such subjects. To the following. Cheers

  8. This is getting a bit more subjective, but I much prefer the Zune Marketplace. The interface is colorful, has more flair, and some cool features like ‘Mixview’ that let you quickly see related albums, songs, or other users related to what you’re listening to. Clicking on one of those will center on that item, and another set of “neighbors” will come into view, allowing you to navigate around exploring by similar artists, songs, or users. Speaking of users, the Zune “Social” is also great fun, letting you find others with shared tastes and becoming friends with them. You then can listen to a playlist created based on an amalgamation of what all your friends are listening to, which is also enjoyable. Those concerned with privacy will be relieved to know you can prevent the public from seeing your personal listening habits if you so choose.

  9. Hi there just wanted to give you a quick heads up. The words in your content seem to be running off the screen in Internet explorer. I’m not sure if this is a format issue or something to do with web browser compatibility but I thought I’d post to let you know. The design look great though! Hope you get the problem resolved soon. Cheers

  10. This design is spectacular! You definitely know how to keep a reader entertained. Between your wit and your videos, I was almost moved to start my own blog (well, almost…HaHa!) Fantastic job. I really enjoyed what you had to say, and more than that, how you presented it. Too cool!

  11. Youre so cool! I do not mean Ive review anything similar to this prior to. So good to discover somebody with some original thoughts on this subject. realy thanks for starting this up. this website is something that is needed on the internet, a person with a little creativity. useful job for bringing something new to the net!

  12. Nice message. I find out something more difficult on various blog sites everyday. It will certainly constantly be boosting to read material from other authors as well as practice a something from their store. I?d choose to make use of some with the web content on my blog whether you don?t mind. Natually I?ll offer you a web link on your internet blog. Thanks for sharing.

  13. The following time I check out a blog, I hope that it does not disappoint me as long as this one. I indicate, I recognize it was my selection to read, but I actually thought youd have something fascinating to state. All I hear is a bunch of whimpering about something that you might deal with if you werent too active looking for attention.

  14. I uncovered your blog website on google as well as check a few of your early posts. Remain to maintain the excellent operate. I just additional up your RSS feed to my MSN News Viewers. Looking for forward to learning more from you in the future!?

  15. There are some intriguing times in this write-up but I don?t understand if I see all of them facility to heart. There is some validity yet I will take hold point of view up until I look into it better. Good post, many thanks and we want extra! Contributed to FeedBurner as well

  16. I?m pleased, I should state. Actually rarely do I encounter a blog site that?s both enlightening and amusing, as well as let me inform you, you have actually struck the nail on the head. Your idea is exceptional; the issue is something that inadequate individuals are talking smartly around. I am very pleased that I came across this in my look for something connecting to this.

  17. Oh my goodness! an outstanding short article man. Thanks Nonetheless I am experiencing concern with ur rss. Don?t understand why Unable to register for it. Is there anybody obtaining similar rss issue? Anybody who understands kindly respond. Thnkx

  18. Hi would you mind letting me know which hosting company you’re working with?

    I’ve loaded your blog in 3 completely different web browsers and I must say
    this blog loads a lot quicker then most. Can you suggest
    a good internet hosting provider at a fair price? Kudos, I appreciate it!

  19. I am usually to blogging and also i actually appreciate your material. The short article has actually peaks my rate of interest. I am going to bookmark your site and maintain looking for brand-new details.

  20. The following time I check out a blog, I really hope that it does not disappoint me as high as this set. I suggest, I recognize it was my selection to read, but I actually assumed youd have something fascinating to claim. All I hear is a bunch of whimpering about something that you can repair if you werent as well hectic seeking interest.

  21. When I initially commented I clicked the -Notify me when new remarks are included- checkbox and also now each time a remark is included I get four e-mails with the exact same comment. Is there any way you can remove me from that service? Many thanks!

  22. I am usually to blogging and i really appreciate your content. The write-up has truly peaks my rate of interest. I am mosting likely to bookmark your website as well as maintain looking for new information.

  23. Aw, this was an actually nice post. In concept I wish to put in writing such as this additionally? taking time and also actual initiative to make an excellent article? however what can I state? I procrastinate alot and by no means seem to obtain something done.

  24. Hiya very nice website!! Guy .. Excellent .. Superb .. I will bookmark your blog and take the feeds additionally? I’m happy to find so many helpful information right here within the post, we want work out extra techniques in this regard, thank you for sharing. . . . . .

댓글 남기기