C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[49069] Implicit dll 을 테스트해보기위해 작성중..
우민주 [] 1232 읽음    2007-04-26 12:52
질문이 세가지입니다....

길다고 안 읽지 마시고 대답해주시고 싶은거 하나만이라도 해주셔요.. plz

=========== 워크스페이스 환경구성 ==============
워크스페이스는 IMPLICIT_DLL이고 2개의 프로젝트를 생성했습니다
첫번째 프로젝트는 EXE, 두번째 프로젝트는 DLL 입니다

=========== 프로젝트 환경구성 ==============
첫번째 프로젝트 EXE는 win32 console application으로 했고
an empty project를 선택했습니다.

두번째 프로젝트 DLL은 win32 Dynamic-Link Library으로 했고
an empty DLL project를 선택했습니다.
============ 의존성 =======================

dependences는 EXE=>DLL에 되도록 하여 DLL 프로젝트가 먼저 컴파일되게 했습니다.


============= 소스코드 =========================
=========두번째 DLL 프로젝트

**헤더파일:

// MyDll.h
#pragma once
#ifdef MYLIB_EXPORT
#define MYLIBAPI __declspec(dllexport)
#else
#define MYLIBAPI __declspec(dllimport)
#endif

MYLIBAPI int GetData();
MYLIBAPI void SetData(int);

********* C 소스파일:
#include "stdafx.h"
#define MYLIB_EXPORT
#include "MyDll.h"
static int g_nData;
BOOL APIENTRY DllMain(HANDLE module,DWORD ul_reason_for_call,LPVOID lpReserved)
{
    return true;
}
MYLIBAPI int GetData()
{
    return g_nData;
}
MYLIBAPI void SetDaata(int data)
{
    g_nData=data;
}

입니다.....   특이한 것이라곤 __declspec(dllexport)를 MyDll.h에서 MYLIBAPI로 정의해서
소스파일에서는 MYLIBAPI로 사용하고 있습니다..



========첫번째 EXE 프로젝트
소스코드
#include "stdafx.h"
#include <iostream>
#include "MyDll.h"
using namespace std;
int main(int argc,char* argv[])
{
    int data = 0;
    cout << "DLL data: " << GetData() << "\n";
    cout << "Input Data: ";
    cin >>data;
    SetData(data);
    cout << "Changed dll data: ";
    cout << GetData() <<"\n";
    return 0;
}

이렇게 짜여져 있습니다.
====================   기능 요약  =================================
주요 기능은 사용자에게 입력 받은 값이 SetData 함수에의해 dll의 static int g_nData 요기 변수에 들어가게 되고
GetData()함수로 출력하고 끝납니다...




여기까지 읽어주셔서 감사합니다...

여기서 물어보고싶은것이 있습니다.

============== 첫번째 컴파일 에러!!!  stdafx.h ==================================
해당 헤더를 찾을 수 없다고 합니다.
그래서 project => settings 의 c/c++ 탭에서 category 항목의 "Precompiled Headers"를 선택하고
생성되는 아래의 라디오박스 중에서 create precompiled header file (.pch)를 누르고 Through header란에
stdafx.h를 썼습니다. 역시 같은 오류가 나서 use precompiled header file (.pch)를 누르고 Through header란에
stdafx.h를 썼습니다.  역시 안되었습니다.

그래서 프로젝트를 다시 생성했습니다. 첫번째 프로젝트는 A "Hello,World" application으로,
두번째 프로젝트는 a Simple Dll Project로 했습니다.

여기에는 stdafx.cpp와 stdafx.h가 있어서 다행스럽게 이 문제는 해결되었습니다.

A "Hello,World" application, a Simple Dll Project 프로젝트로 생성한 프로젝트 컴파일 옵션도  보면
use precompiled header file (.pch) 여기의 Through header 란에 stdafx.h라고 써있던데..
stdafx.cpp가 특별한 무언가를 수행하나요?

처음에 선택했던 an empty project로는 할 수 없나요?? 방법좀 알려주세요...

================== 두번째 컴파일 문제 !!  MyDll.h =======================
문제라기 보단 개발자님들은 보통 어떻게 하시는지 여쭙고 싶어서요...
dll을 로딩해서 사용하는 첫번째 EXE프로젝트의 소스를 보시면
MyDll.h라는 헤더를 (임포트 해야 되니까 당연히 헤더를 불러와야겠죠??) include합니다.

컴파일 할때 에러가 나서
저는 EXE프로젝트의 File View에서 header files 에 두번째 DLL 프로젝트에 존재하는 MyDll.h파일을
Add했습니다.
개발자님들은 어떻게 하시나요? EXE프로젝트 디렉토리에 복사를 하시나요?? 아니면 다른 더 좋은 방법이있나요?

=================  마지막 세번째 문제 !!!  링크 문제  =================================
컴파일이 정상적으로 성공하고, 링크하는데 에러가 발생했습니다.
Link문제로 unresolve 에러가 나네요...
unresolved external symbol "__declspec(dllimport) void __cdecl SetData(int)" (__imp_?SetData@@YAXH@Z)
이렇게요..
그래서 저는 Project => Settings 에 Link탭에서 Category 항목의 General을 선택하고
Object / Library Modules 란에다가 아까 생성된 DLL프로젝트의 debug 디렉토리에 존재하는 dll.lib 파일을
절대경로 포함하여 써주었습니다.. 역시 링크가 안되는군요...

+ -

관련 글 리스트
49069 Implicit dll 을 테스트해보기위해 작성중.. 우민주 1232 2007/04/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.