DLL 학습 내용 작성 (2) - 클래스 내보내기
3161 단어 QT
DLL 학습 내용 작성 (2) - 클래스 내보내기
2011.10.6
초가을
1. 내보내기 클래스의 간단한 방식
이런 방식은 비교적 간단하면서도 채택을 건의하지 않는 부적합한 방식이기도 하다.
내보내기 클래스에 만 추가하면declspec (dllexport) 에서 클래스를 내보낼 수 있습니다.대상 공간은 사용자의 모듈에서 dll은 클래스의 함수 코드만 제공합니다.부족한 점은 사용자가 전체 클래스의 실현을 알아야 한다는 것이다. 기본 클래스, 클래스 중의 구성원 대상을 포함한다. 즉, 도출 클래스와 관련된 모든 것을 사용자가 알아야 한다.Dependency Walker를 통해 알 수 있듯이 이때의 dll은 클래스와 관련된 함수를 도출했다. 예를 들어 구조 함수, 값 부여 조작부호, 분석 함수, 기타 함수는 사용자가 사용할 수 있는 함수이다.
이런 도출 클래스의 방식은 도출된 것이 너무 많고 사용자가 클래스의 실현에 대한 의존이 너무 많은 것 외에 다른 문제도 있다. 같은 컴파일러를 사용해야 한다는 것이다.내보내기 클래스의 본질은 내보내기 클래스의 함수입니다. 문법적으로 클래스를 직접 내보냈기 때문에 함수의 호출 방식, 이름 바꾸기를 설정하지 않았기 때문에 발생하는 dll가 통용되지 않습니다.
부분 코드(DLL 헤더 파일)://2011.10.6//cswuyg//dll , #pragma once#ifdef NAIVEAPPROACH_EXPORTS#define NAIVEAPPROACH_API __declspec(dllexport)#else#define NAIVEAPPROACH_API __declspec(dllimport)#endif// , :class NAIVEAPPROACH_API CBase{public: void Test();private: int m_j;};// class NAIVEAPPROACH_API CDate{public: void Test2();private: int m_k;};class NAIVEAPPROACH_API CNaiveApproach : public CBase{public: CNaiveApproach(int i = 0); // TODO: add your methods here. void Func();private: int m_iwuyg; CDate m_dobj;};
데모 코드는 첨부 파일 Naive Approach 섹션을 참조하십시오.
2. 도출류의 비교적 좋은 방식
이런 방식은 비교적 적합하다.com과 유사하다.
구조는 다음과 같다. 도출류는 파생류이고 추상류에서 파생된다. 모두 순허함수이다.사용자는 이 추상류의 구조를 알아야 한다.DLL은 최소한 클래스 객체 포인터를 가져오는 인터페이스만 제공하면 됩니다.사용자와 DLL 공급자는 추상적인 클래스의 헤더 파일을 공용한다. 사용자는 DLL에 의존하는 것이 매우 적고 추상적인 클래스의 인터페이스와 대상 포인터의 내보내기 함수만 알 수 있다. 대상 메모리 공간의 신청은 DLL 모듈에서 했고 방출도 DLL 모듈에서 완성했다. 마지막으로 방출 대상의 함수를 호출해야 한다는 것을 기억한다.
이런 방식은 비교적 좋고 통용되며 발생하는 DLL은 특정한 환경 제한이 없다.C++ 클래스의 허함수를 빌렸다.일반적으로 모두 이런 방식을 채택한다.DLL 내보내기 클래스에 좋은 점을 제외하고 인터페이스와 분리를 사용하면 프로젝트의 구조를 더욱 뚜렷하게 할 수 있고 사용자는 인터페이스만 알고 실현을 알 필요가 없다.
부분 코드:
(1) DLL 헤더 파일://2011.10.6//cswuyg//dll //dll #pragma once#ifdef MATUREAPPROACH_EXPORTS#define MATUREAPPROACH_API __declspec(dllexport)#else#define MATUREAPPROACH_API __declspec(dllimport)#endifclass IExport{public: virtual void Hi() = 0; virtual void Test() = 0; virtual void Release() = 0;};extern "C" MATUREAPPROACH_API IExport* _stdcall CreateExportObj();extern "C" MATUREAPPROACH_API void _stdcall DestroyExportObj(IExport* pExport);
(2) 클래스 헤더 파일을 내보내려면 다음과 같이 하십시오.//2011.10.6//cswuyg//dll // #pragma once#include "MatureApproach.h"class ExportImpl : public IExport{public: virtual void Hi(); virtual void Test(); virtual void Release(); ~ExportImpl();private:};
데모 코드는 첨부 파일MatureApproach 섹션을 참조하십시오.
3. 총결산
도출류는 비교적 간단하고 헷갈리기 쉬운 개념이다. 지난 편의 총결은 이미 끝났다.본질적으로 말하면 도출 함수와 차이가 없다.VS2005에서 자동으로 생성된 코드를 사용하면 많은 힘을 절약할 수 있고 이전에 연습한 것보다 무엇이든 직접 쓰기가 훨씬 편리해졌다.프로젝트의 설정에 주의해야 한다. 그것들의 작용을 익히면 프로그래밍 속도를 높일 수 있다.
데모 코드 첨부 파일:
http://files.cnblogs.com/cswuyg/%E7%BC%96%E5%86%99DLL%E6%89%80%E5%AD%A6%E6%89%80%E6%80%9D(2)(%E5%AF%BC%E5%87%BA%E7%B1%BB).rar
참조 자료:
http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
간편한 채팅 시스템 - 메시지 전달 서버
메시지 전송 서버는 메시지 대기열에서 온 데이터를 받아들여 디코딩, 식별 등을 하고 마지막으로 분류를 나눈다.예를 들어 채팅 시스템은 같은 그룹과 같은 세션의 정보를 같은 그룹 서비스로 전송한다(물론 아직 같은 그룹...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
//2011.10.6//cswuyg//dll , #pragma once#ifdef NAIVEAPPROACH_EXPORTS#define NAIVEAPPROACH_API __declspec(dllexport)#else#define NAIVEAPPROACH_API __declspec(dllimport)#endif// , :class NAIVEAPPROACH_API CBase{public: void Test();private: int m_j;};// class NAIVEAPPROACH_API CDate{public: void Test2();private: int m_k;};class NAIVEAPPROACH_API CNaiveApproach : public CBase{public: CNaiveApproach(int i = 0); // TODO: add your methods here. void Func();private: int m_iwuyg; CDate m_dobj;};
//2011.10.6//cswuyg//dll //dll #pragma once#ifdef MATUREAPPROACH_EXPORTS#define MATUREAPPROACH_API __declspec(dllexport)#else#define MATUREAPPROACH_API __declspec(dllimport)#endifclass IExport{public: virtual void Hi() = 0; virtual void Test() = 0; virtual void Release() = 0;};extern "C" MATUREAPPROACH_API IExport* _stdcall CreateExportObj();extern "C" MATUREAPPROACH_API void _stdcall DestroyExportObj(IExport* pExport);
//2011.10.6//cswuyg//dll // #pragma once#include "MatureApproach.h"class ExportImpl : public IExport{public: virtual void Hi(); virtual void Test(); virtual void Release(); ~ExportImpl();private:};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
간편한 채팅 시스템 - 메시지 전달 서버메시지 전송 서버는 메시지 대기열에서 온 데이터를 받아들여 디코딩, 식별 등을 하고 마지막으로 분류를 나눈다.예를 들어 채팅 시스템은 같은 그룹과 같은 세션의 정보를 같은 그룹 서비스로 전송한다(물론 아직 같은 그룹...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.