- HOME
- Post in | 기록
- Post at | 2013. 4. 23. 15:40 | by 밀크빵.
- View comment
DWORD WINAPI ThreadFunc(LPVOID temp)
{
printf("dd");
return 0;
}
void main()
{
HANDLE hHandle;
DWORD ThreadID;
hHandle = CreateThread(NULL, 0, ThreadFun, NULL, 0 &ThreadID);
Sleep(10000)
}
c++ 작업 스케줄러 > 가장 높은 수준의 권한으로 실행 (0) | 2014.03.05 |
---|---|
c++ 관리자 권한으로 프로그램 실행시키는 방법 (0) | 2014.03.03 |
정규식 표현 (0) | 2013.03.27 |
스레드 생성 (0) | 2013.03.26 |
MMF(Memory Mapping File) & Shared Memory (0) | 2013.03.26 |
#include <iostream>
#include <string>
#include <boost/regex.hpp> // Boost.Regex lib
#include <fstream>
using namespace std;
const int BUFSIZE = 10000;
int main(int argc, char ** argv )
{
string s, sre;
boost::regex re;
boost::cmatch matches;
cout << "Expression : ";
cin >> sre;
cout <<"str: ";
cin >> s;
try
{
re = sre;
}
catch(boost::regex_error& e)
{
cout << sre << "is not a valid regular expression : " << e.what() << endl;
// continue;
}
if(boost::regex_match(s.c_str(), matches, re))
{
for(int i = 0; i<matches.size(); i++)
{
string match(matches[i].first, matches[i].second);
cout <<"\tmatches[" <<i << "] \ " <<match <<endl;
}
}
else
{
cout << "The regexp \"" << re << "\" does not mach \"" << s <<"\"" <<endl;
}
}
c++ 관리자 권한으로 프로그램 실행시키는 방법 (0) | 2014.03.03 |
---|---|
스레드 생성 (0) | 2013.04.05 |
스레드 생성 (0) | 2013.03.26 |
MMF(Memory Mapping File) & Shared Memory (0) | 2013.03.26 |
JSON 사용하기 (0) | 2013.03.13 |
서비스 <- 응용 프로그램
서비스는 커널에서 동작 하기 때문에 공유 메모리 생성할때 전역 이름을 주어야 함
Global\\이름
서비스->응용 프로그램
시스템영역의 프로세스와 일반 유저영역의 프로세스간의 파일 접근 권한이 다름
접근 권한으로 공유 메모리 생성해야 함
Kernel Object Namespaces (0) | 2013.03.27 |
---|---|
서비스 - 프로그램 IPC (0) | 2013.03.20 |
7.드라이버에서 라이브러리 사용하기 (0) | 2013.03.11 |
6. 드라이버와 에이전트와의 통신 (0) | 2013.03.11 |
5. 드라이버의 설치 및 확인 방법 (0) | 2013.03.11 |
대해서 복합적인 이름을 사용할수 있도록 되어 있다. 전역적인 이름은 클라이언트/서버 형식의 응용프로그램들이
많이 사용한다. 그리고 각 클라이언트 세션(session)은 위에 열거한 객체들을 위해 분리된 독자적인 이름 공간을 가지고 있다.
이것은 모든 프로세스와 서비스가 위에 열거한 객체들을 위해 단일화된 이름공간을 공유한다는 원칙과 차이가 있다는것에
주의해야 한다.
여러번 실행된 각각의 프로그램이 서로에게 영향을 받지 않고 실행되도록 하기 위함이다.
클라이언트 세션에서 실행한 프로세스들은 기본적으로 세션내의 이름공간을 사용한다. 그러나 프로세스가 객체의
이름을 명시할때 "Global\"과 같은 접두어를 사용해서 이름을 명시한다면 전역적인 이름공간을 사용하게 된다.
세션내에 이름공간을 사용할 것이다.
시작 세션(Session Zero, 일반적으로 콘솔 세션 또는 서비스 세션)하에서 실행되는 프로그램도 기본적으로
전역적인 이름공간을 사용한다. 이것은 전역적인 이름공간을 사용해서 여러개의 클라이언트 세션에 실행된 각각의
프로세스가 서로 통신하는것을 가능하게 한다.
서버루틴에서 사용하는 객체들은 전역적인 이름공간을사용하기때문에 클라이언트 세션 또는 일반 사용자 세션에서
서버가 만든 객체를 사용하고자 한다면 객체의 이름을 명시할때, "Global\"이라는 접두어를 이름앞에 붙여서 사용해야 한다.
커널객체를 이용하여 세션내에서 실행되는 프로그램에 대햐여 중복실행 체크가 가능하지만 다른 세션에 같은 프로그램이
실행되는것은 체크할수 없다. 따라서 현재 시스템에서 실행중인 모든세션에서 특정 프로그램이 중복 실행되지 않도록 하려면
전역적인 이름 공간을 사용해서 객체를 생성시키고 체크하면 된다.
싶다면 "Local\"이라는 접두어를 사용하면 된다.
사용하면 안된다. 하지만 이용어들은 대소문자를 구별하기 때문에 LOCAL, loCAL과 같은 형태로 사용하는것은 문제가되지
않는다. 그리고 터미널 서비스를 제공하지 않는 Windows 2000 제품군에서는 위 용어들이 무시될 것이다.
서비스 <-> 응용 프로그램 간의 IPC (0) | 2013.03.27 |
---|---|
서비스 - 프로그램 IPC (0) | 2013.03.20 |
7.드라이버에서 라이브러리 사용하기 (0) | 2013.03.11 |
6. 드라이버와 에이전트와의 통신 (0) | 2013.03.11 |
5. 드라이버의 설치 및 확인 방법 (0) | 2013.03.11 |
#include <windows.h>
#include <process.h>
#include <iostream>
using namespace std;
#define MAX_THREAD 2
DWORD WINAPI ThFunc(LPVOID lpParam)
{
int n;
printf("[%d] address of 'n' is %p\n", _threadid, &n);
printf("[%d] exit\n", _threadid);
return 0;
}
int main(int argc, char **argv)
{
int i = 0, nData = 100;
DWORD dwThID[MAX_THREAD];
HANDLE hThreads[MAX_THREAD];
unsigned long ulStackSize = 0;
memset(dwThID, 0, sizeof(dwThID)/sizeof(dwThID[0]));
memset(hThreads, 0, sizeof(hThreads)/sizeof(hThreads[0]));
for ( i = 0; i < MAX_THREAD; i++ )
{
hThreads[i] = CreateThread(NULL, ulStackSize, ThFunc, &nData, CREATE_SUSPENDED, &dwThID[i]);
printf("[%d] start\n", (int)dwThID[i]);
SetThreadPriority(hThreads[i], THREAD_PRIORITY_HIGHEST);
printf("[%d] thread priority is %d\n", dwThID[i], GetThreadPriority(hThreads[i]));
ResumeThread(hThreads[i]);
}
WaitForMultipleObjects(MAX_THREAD, hThreads, TRUE, INFINITE);
printf("thread working is done.\n");
for ( i = 0; i < MAX_THREAD; i++ )
CloseHandle(hThreads[i]);
return 0;
}
스레드 생성 (0) | 2013.04.05 |
---|---|
정규식 표현 (0) | 2013.03.27 |
MMF(Memory Mapping File) & Shared Memory (0) | 2013.03.26 |
JSON 사용하기 (0) | 2013.03.13 |
ip/ mac 주소 얻기 (0) | 2013.02.25 |
MMF 랑 Shared Memory랑 다른 건가?
싶어서 검색 ㄱㄱ
"MMF를 이용하여 Shared Memory를 구현한다"
를 보고 둘이 다른 것임을 알았다
MMF = FILE MAPPING이고,
파일을 메모리에 연결 하여 메모리에 입출력 하는 것
FILE 을 메모리에 올려 사용하는 것도 포함 (프로세스 <-> 파일)
1. CreatFile()
2. CreateFileMapping
3. MapViewOfFile()
공유 메모리를 이용하여 사용하는 것도 포함( 프로세스 <-> 프로세스 )
1. CreateFileMapping()
2. MapviewOfFile()
맞나?ㅠㅠ
서비스->응용프로그램, 응용프로그램->서비스 로의
IPC가 가능하네요.
기본적으로 응용프로그램->서비스로는 User Define 이벤트를 제공하니 문제가 안될 것 같구요.
우선 서비스를 아래와 같이 SERVICE_INTERACTIVE_PROCESS 프로세스를 추가하고,
// 서비스를 등록한다.
hSrv=CreateService(m_hScm,
m_szSrvName, m_szDspName, SERVICE_PAUSE_CONTINUE | SERVICE_CHANGE_CONFIG,
SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START/*SERVICE_DEMAND_START*/,SERVICE_ERROR_IGNORE,SrvPath,
NULL,NULL,NULL,NULL,NULL);
서비스에서의 데이터를 줄 때 저 같은 경우는 Shared Memory와 RegisterWindowMessage 를 사용했습니다.
데이터는 구조체를 썼구요.
서비스에서 Shared Memoery에 데이터를 썼구요.
어플리케이션으로 데이터가 있음을 알려주기 위해 RegisterWindowMessage를 사용했습니다.
SERVICE_INFO pSer;
strcpy(pSer.szMessage, tmp);
CreateServiceShareMemory(&pSer);
HWND hwnd = ::FindWindow(NULL,
"WaBis Service Manager");
if(hwnd){
::PostMessage(hwnd, WM_SERVICE_MESSAGE, 0,
0);
//::PostMessage(hwnd, WM_SERVICE_MESSAGE,
(WPARAM)&pSer, 0);
}
어플리케이션에서는
ON_REGISTERED_MESSAGE(WM_SERVICE_MESSAGE, OnWaBISEvtMessage) 정의하고,
LRESULT
CWaBisServiceManagerDlg::OnWaBISEvtMessage(WPARAM wParam, LPARAM lParam)
{
SERVICE_INFO pSer;// *pInfo = (SERVICE_INFO *)wParam;
int isSuccess = ReadServiceSharedMemory(&pSer);
if(isSuccess){
// 서비스의 데이터가 있다면
if(strlen(pSer.szMessage) !=0){
m_ListBox.InsertString(0, pSer.szMessage);
if(m_ListBox.GetCount() > 500){
m_ListBox.ResetContent();
}
}
}
return 0;
}
서비스 <-> 응용 프로그램 간의 IPC (0) | 2013.03.27 |
---|---|
Kernel Object Namespaces (0) | 2013.03.27 |
7.드라이버에서 라이브러리 사용하기 (0) | 2013.03.11 |
6. 드라이버와 에이전트와의 통신 (0) | 2013.03.11 |
5. 드라이버의 설치 및 확인 방법 (0) | 2013.03.11 |
1. Json 관련 헤더 파일 포함
A. autolink.h
B. config.h
C. features.h
D. json.h
E. json_batchallocator.h
F. json_internalarray.inl
G. json_internalmap.inl
H. json_valuiterator.inl
I. reder.h
J. value.h
K. writer.h
2. 소스 파일 포함
A. json_reader.cpp
B. json_value.cpp
C. json_writer.cpp
3. 사용 방법
A. 데이터 저장
{ Json::Value root;
Json::Value encoding;
root["encoding"] = "UTF-8";
Json::Value plugins;
plugins.append("python");
plugins.append("C++");
plugins.append("ruby");
plugins.append(test);
root["plub-ins"] = plugins;
Json::Value indent;
indent["length"] = 3;
indent["use_space"] = true;
root["indent"] = indent;
Json::StyledWriter writer;
std::string outputConfig = writer.write( root );
}
스레드 생성 (0) | 2013.03.26 |
---|---|
MMF(Memory Mapping File) & Shared Memory (0) | 2013.03.26 |
ip/ mac 주소 얻기 (0) | 2013.02.25 |
서비스 (0) | 2013.02.25 |
const 과 #define (0) | 2013.01.30 |