336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

컴파일러 경고 (수준 4) C4840

variadic 함수의 인수로 서 'type' 클래스를 이식 불가능 하 게 사용 합니다.

설명

Variadic 함수에 전달 되는 클래스 또는 구조체는 일반적으로 copyable 이어야 합니다. 해당 개체를 전달할 때 컴파일러는 비트 복사본을 만들기만 하고 생성자 또는 소멸자를 호출하지 않습니다.

이 경고는 Visual Studio 2017부터 사용할 수 있습니다.

예제

다음 샘플에서는 C4840를 생성 하 고 수정 하는 방법을 보여 줍니다.

 

// C4840.cpp
// compile by using: cl /EHsc /W4 C4840.cpp
#include <stdio.h>

int main()
{
    struct S {
        S(int i) : i(i) {}
        S(const S& other) : i(other.i) {}
        operator int() { return i; }
    private:
        int i;
    } s(0);

    printf("%i\n", s); // warning C4840 : non-portable use of class 'main::S'
                       // as an argument to a variadic function
    // To correct the error, you can perform a static cast
    // to convert the object before passing it:
    printf("%i\n", static_cast<int>(s));
}

 

를 사용 하 여 작성 및 관리 되는 문자열의 경우 CStringW 제공 된를 operator LPCWSTR() 사용 하 여 CStringW 개체를 서식 문자열에 필요한 C 스타일 문자열 포인터로 캐스팅 해야 합니다.

 

CStringW str1;
    CStringW str2;
    // ...
    str1.Format("%s", static_cast<LPCWSTR>(str2));

 

ATL,CPP,C# dll 배포

Programming/C,CPP,CS 2016. 5. 27. 10:56 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

ATL,CPP,C# dll 배포


dll 배포 관련 질문이 올라와서 저도 다시 한번 정리 할겸 올려 봅니다.







DLL reg 등록 방법


1. Visual Studio 기반으로 dll 을 만들어서


 디버그 옵션을 조절하여 


 html 이나 특정 app 을 실행하는 형태로 프로젝트 설정을 하였다면


 자동으로 Visual Studio 가 dll 을 해당 컴퓨터에 등록하게 됩니다.



배포를 하려면 배포할 컴퓨터에 일일이 Visual Studio 를 설치 할 수 없으므로


아래의 방법을 활용 합니다.




2.  regsvr32.exe 활용


regsvr32.exe 는 


C:\Windows\System32 경로에 존재합니다.



참고 64비트 버전의 Windows 운영 체제에는 다음과 같은 두 가지 버전의 Regsv32.exe 파일이 있습니다.

  • 64비트 버전은 %systemroot%\System32\regsvr32.exe입니다.
  • 32비트 버전은 %systemroot%\SysWoW64\regsvr32.exe입니다.



regsvr32.exe 사용중 오류는 msdn 문제 해결 방법이 제일 무난한것 같습니다.



https://support.microsoft.com/ko-kr/kb/249873






사용방법은


관리자 권한으로 cmd 를 연 후


등록 : regsvr32 xxxx.dll

등록해제 : regsvr32 xxxx.dll /u


인데


regsvr32 를 찾지 못할경우 system 경로로 이동하여 실행하거나


regsvr32 만 필요한 경로에 복사하여 사용하여도 됩니다.



regsvr32 는 C, CPP, ATL dll 을 올리기 위한 용도이고


같은 방법으로 regasm 을 활용하면 C# dll 을 올릴수 있습니다.


3. Install Uitility


인스톨 쉴드, 인스톨 팩토리등 인스톨 관련 유틸리티를 활용하여


setup.exe 파일을 만들경우 dll 을 등록하는 메뉴도 있기에 설치하며 등록 할 수도 있습니다.









'Programming > C,CPP,CS' 카테고리의 다른 글

Log4cxx Tutorial  (0) 2016.06.28
Log Librarys  (0) 2016.06.27
Free Dia Diagram Editor  (0) 2016.04.28
Windows 버전별 기본 포함 .NET Framework  (0) 2016.04.14
c# dll ClassLibrary 에서 MessageBox.Show(text,title);  (0) 2016.04.06

MFC 프로젝트에서 ATL 연동하기

Programming/COM,ATL 2016. 3. 29. 11:44 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

MFC 프로젝트에서 ATL 연동하기


작업 환경 : VS2013


일반 MFC 프로젝트를 만듭니다.




2. 대화 상자 기반



ActiveX 컨트롤 체크 확인



만들어진 다이얼로그에서 ActiveX 컨트롤 추가



추가하면 하얀 네모가 다이얼로그에 추가된다.



ActiveX 컨트롤을 클릭한다음 우클릭하여 속성이 뜨고 번개모양 아이콘을 누르면 연결된 이벤트들이 확인된다.



ATL 의 Property 와 Method 는 ActiveX 컨트롤 멤버변수 추가하여서 사용이 가능하다.



예제로는 Ctrl 이라는 멤버 변수를 추가하였다.

다음과 같이 h, cpp 파일이 만들어진다.



내부에는 ATL 에서 구현한 Property 와 Method 가 보인다.



ActiveX 컨트롤에서 이벤트 처리 함수를 추가하였다.



이제 Ctrl 의 Property 와 Method 를 불러올 수 있다.



c, cpp, com, atl, stl, vc7 String

Programming/C,CPP,CS 2016. 3. 28. 10:14 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


. C 자료형

    char (1) , short (2) , int (4) , long (4), float (4) , double (8) , bool 

    문자 : char

    char szName[20] = "kim";


 

2. WIN API 자료형

 

    BYTE (1,unsigned char) , WORD (2,unsigned short) , UNIT (4, unsigned int) , 

    DWORD (4,unsigned long) , LONG (4,long) , BOOL

    문자 : UCHAR (unsigned char)

    핸들 : 대상을 구분하는 4바이트 정수(HWND, HDC 등)

 

    MBCS문자(열)                 유니코드문자(열)           자동매크로문자(열)

    char                                     wchar_t                              TCHAR

    LPSTR(char*)                    LPWSTR(wchar_t*)        LPTSTR

    LPCSTR(const char*)      LPCWSTR                         LPCTSTR

 

    (참조1) 문자열에 대해 그냥 습관적으로 LPTSTR 또는 LPCTSTR 를 써라

    (참조2) 헝가리안명명법 

                   w(WORD) , dw(DWORD) , i(int) , b(BOOL) , ch(문자) , sz(문자열) , h(핸들)

                   cb(바이트수) , a(배열)

 (참조3) OLECHAR(wchar_t), LPOLESTR(LPWSTR), LPCOLESTR(LPCWSTR), OLESTR(x) = _T(x)


 

3. COM 스트링


    BSTR : 문자열길이를 시작전에 저장하고, 이어서 유니코드문자열을 저장하는 방식
                  1> LPCWSTR ->  BSTR : 생성안됨. 생성함수를 이용해야함
                               BSTR bstr = sysAllocString(L"Hi Bob"); // 메모리할당

                              sysFreeString(bstr); // 메모리제거

                  2> BSTR  ->  LPCWSTR : 형변환 가능

 

    VARIANT : 문자열이 들어올때  BSTR과 동일

 

4. CRT(c runtime library) 지원 스트링클래스

 

    _bstr_t : BSTR랩퍼클래스, 메모리할당/제거를 자동으로 수행

                  1> LPCSTR, LPCWSTR  -> _bstr_t 
                               _bstr_t bs1 = "char string";  // 생성

                  2> _bstr_t  ->  LPCSTR, LPCWSTR 
                               LPCSTR psz1 = (LPCSTR)bs1; // 형변환

                  3> _bstr_t  ->  BSTR : 형변환안됨함수이용
                               BSTR bstr = bs1.copy();

                               sysFreeString(bstr);  // BSTR은 사용후 메모리해제를 해야하는 불편이있음..

 

    _variant_t : VARIANT랩퍼클래스, 메모리할당/제거를 자동으로 수행

                  1> LPCSTR, LPCWSTR  -> _variant_t 
                               _variant_t v1 = "char string"; // 생성

                  2> _variant_t  -> _bstr_t  ->  LPCSTR, LPCWSTR 
                               LPCSTR psz1 = (LPCSTR)(_bstr_t)v1;  //형변환

 

5. ATL 지원 스트링클래스

 

    CComBSTR : BSTR랩퍼클래스, 메모리할당/제거를 자동으로 수행

                  1> LPCSTR, LPCWSTR  ->  CComBSTR 

                               CComBSTR bs1 = "char string"; // 생성

                  2> CComBSTR  ->  BSTR   -> LPCWSTR

                               BSTR bstr = (BSTR)bs1;  // 형변환

 

                  (참조) BSTR -> CComBSTR 

                               CComBSTR bs2; bs2.Attach(W2BSTR(L"Bob"))

                              

    CComVariant : VARIANT랩퍼클래스, 메모리할당/제거를 자동으로 수행

                  1> LPCSTR, LPCWSTR  ->  CComVariant 

                               CComVariant bs1 = "char string"; // 생성

                  2> CComVariant  ->  CComBSTR   ->  BSTR   -> LPCWSTR

                               CComBSTR bs2 = bs1.bstrVal;

 

6. STL 스트링

 

    string 

                  1> LPCSTR -> string

                                string  str = "char string"; //생성

                  2> string -> LPCSTR : 형변환 안됨. 함수이용 

                                LPCSTR psz = str.c_str();

    wstring

                   1> LPCWSTR -> wstring

                                wstring  str = "wide char string"; //생성

                  2> wstring -> LPCWSTR : 형변환 안됨. 함수이용 

                                LPCWSTR psz = str.c_str();

 

7. MFC 스트링

 

    CString

                  1> LPCSTR, LPCWSTR  ->  CString 

                                CString  str = "char string"; //생성

                  2> CString  -> LPCTSTR :

                                LPCTSTR  lpsz = (LPCTSTR)str; //형변환

 

                  (참고)  CString  -> LPTSTR :  함수이용

                               LPTSTR lptsz  = str.GetBuffer(0); str.ReleaseBuffer(); //  올바른 사용

                               LPTSTR lptsz  = (LPTSTR)(LPCTSTR)str  //  잘못된 사용

                               CString  -> BSTR  

                               BSTR bstr = str.AllocSysString(); sysFreeString(bstr)

 

8. VC7 스트링

 

    String : .NET에서 새로 정의한 스트링 클래스

                               String* s1 = S"this is nice"; // 생성

                               CString s2(s1); // 형변환


출처 : http://hacheo.egloos.com/3891296


ATL/COM 강좌

Programming/COM,ATL 2016. 3. 25. 16:21 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

ATL/COM 강좌


  COM(Component Object Model)은 컴포넌터 기반의 분산 컴퓨팅 기술이고, ATL(Active Template Library)은 그 COM 프로그래밍을 쉽게 하기 위해 Visual C++에서 제공하는 라이브러리이다. 소개에서는 COM의 개념 및 구조를 개괄적으로 설명하고, Client 프로그램 제작 및 Server 프로그램 제작에서 ATL을 사용하지 않고 COM 프로그램을 작성하는 방법을 설명하는데 이 부분은 개념 위주로 보면 되고, 실제 프로그래밍에서는 나머지 부분(쉬운 Server 프로그램 제작, 쉬운 COM Client 프로그램 제작)을 이용하여 프로그램을 작성한다.


좋은 강좌가 있어서 링크를 올립니다.


http://jys92.com.ne.kr/AtlCom.htm


336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

ATL 프로젝트에서 hWnd사용하기




문제 상황 : 


ATL 프로젝트에서


소켓 통신을 위한 쓰레드를 만들어 사용하다


소켓 통신 도중 특정 메시지 수신시


ATL 이벤트를 발생 시키고 싶었다.


------요약-----------


Worker Thread 에서 ATL event(Fire_xxxx) 실행



직접 Fire 함수를 실행시 Invoke 부분에서


E_UNEXPECTED Catastrophic failure. 를 리턴한다.



Worker Thread 에서 ATl main Thread 의 함수를 실행하여 그런것 같다.



SendMessage 나 PostMessage 로 Main Thread 가 실행하도록 메시지를 주는 방법을 찾던 도중


SendMessage가 hWnd 를 이용하여 타 쓰레드간 메시지를 주고 받을수 있다는 점을 활용하였다.



하지만 기본 ATL 객체는 hWnd 를 갖고 있지 않다.



생성자 호출 시


상속 받은 m_bWindowOnly 변수를 TRUE 로 초기화하면 


m_bWindowOnly = TRUE;



상속 받은 m_hWndCD 를 사용 할 수 있다.


m_hWndCD를 활용하여 WorkerThread 에서


메인 쓰레드로 메세지를 준다.



::SendMessage(pHelloCtrl->m_hWndCD, WM_xxx, (WPARAM)NULL, (LPARAM)NULL);




추가-------

혹시나 메인 쓰레드에서 메세지를 받는 방법을 모르는 사람이 있을까 싶어서 추가합니다.

일반 MFC 는 이런 메세지 맵을 갖고 있는데

BEGIN_MESSAGE_MAP(CMFCApplication2Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication2Dlg::OnBnClickedButton1)
END_MESSAGE_MAP()


ATL 프로젝트는


BEGIN_MSG_MAP(xxxxxx)
MESSAGE_HANDLER(WM_CODE_START, OnSTART)
MESSAGE_HANDLER(WM_CODE_STOP, OnSTOP)
CHAIN_MSG_MAP(CComControl<xxxxxxxx>)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()

이런 메세지 맵을 갖고 있습니다.



여기에 SendMessage 로 받을 메세지를 선언하고 그 때 실행할 함수를 위치시키면 됩니다.




336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

ATL 프로젝트로 만든 DLL 을 MFC 프로젝트에서 사용하기



ATL 프로젝트로 만든 DLL 이름을 ComServer.DLL 이라고 가정하겠습니다.


ComServer 대신에 자신이 만든 DLL 을 쓰면 됩니다.



사용하고자하는 ComServer.dll 파일을 프로젝트 디렉토리에 복사한다.


stdafx.h 파일에 


#import "ComServer.dll" no_namespace named_guids


넣고


빌드를 하게 되면


빌드 폴더에 ComServer.tlh , ComServer.tli 가 생성된것을 확인 할 수 있습니다.



ComServer.tlh 파일을 열어 둡니다.




그다음 Dlg 의 OnInitDialog() 같은 곳에 아래의 코드를 삽입한다.


ComTest 는 객체 이름입니다.


try{


UpdateData();


HRESULT rc;


IComTestPtr pComTest; //IComTest *pComTest 도 가능 !!! (IComTest 의 스마트포인터)


rc = CoCreateInstance(CLSID_ComTest, NULL, CLSCTX_INPROC_SERVER, DIID_IComTest, (void**)&pComTest);


if (FAILED(rc)){


MessageBox("Failure in call to CoCreateInstance");


return;


}


pComTest->(사용하고 싶은 속성이나 메서드);


}


catch (_com_error &e){


CString strBuffer;


strBuffer.Format("Code = %08lXnCode meaning = %snSource = %snDescription = %sn",

e.Error(), e.ErrorMessage(), e.Source(), e.Description());

AfxMessageBox(strBuffer);

}






'Programming > COM,ATL' 카테고리의 다른 글

MFC 프로젝트에서 ATL 연동하기  (2) 2016.03.29
ATL/COM 강좌  (0) 2016.03.25
ATL 프로젝트에서 hWnd사용하기 #2  (0) 2016.03.25
ATL 프로젝트에서 hWnd사용하기  (0) 2016.03.25
ocx, dll 라이브러리 등록  (0) 2016.03.15

ATL 프로젝트에서 hWnd사용하기

Programming/COM,ATL 2016. 3. 25. 11:19 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

ATL 프로젝트에서 hWnd사용하기




문제 상황 : 


ATL 프로젝트에서


소켓 통신을 위한 쓰레드를 만들어 사용하다


소켓 통신 도중 특정 메시지 수신시


ATL 이벤트를 발생 시키고 싶었다.


------요약-----------


Worker Thread 에서 ATL event(Fire_xxxx) 실행



직접 Fire 함수를 실행시 Invoke 부분에서


E_UNEXPECTED Catastrophic failure. 를 리턴한다.



Worker Thread 에서 ATl main Thread 의 함수를 실행하여 그런것 같다.



SendMessage 나 PostMessage 로 Main Thread 가 실행하도록 메시지를 주는 방법을 찾던 도중


SendMessage가 hWnd 를 이용하여 타 쓰레드간 메시지를 주고 받을수 있다는 점을 활용하였다.



하지만 기본 ATL 객체는 hWnd 를 갖고 있지 않다.



생성자 호출 시


상속 받은 m_bWindowOnly 변수를 TRUE 로 초기화하면 


m_bWindowOnly = TRUE;



상속 받은 m_hWndCD 를 사용 할 수 있다.


m_hWndCD를 활용하여 WorkerThread 에서


메인 쓰레드로 메세지를 준다.



::SendMessage(pHelloCtrl->m_hWndCD, WM_xxx, (WPARAM)NULL, (LPARAM)NULL);