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
[67431] Re:Re:Re:Re:DLL 안에서 NEW를 하면 원래 오류가 나는건가요?
김보람 [onmyoji] 1100 읽음    2012-06-07 14:51
Lyn 님이 쓰신 글 :
: export는 cdecl로 하고 import 는 stdcall로 했네요
:
: 김보람 님이 쓰신 글 :
: : Lyn 님이 쓰신 글 :
: : : 그럴리가요
: : :
: : : 뭔가 잘못햇겟죠
: : :
: : : 김보람 님이 쓰신 글 :
: : : : 안녕하세요 요번에 새로 가입하게 된...
: : : :
: : : : 아무개 입니다 네!! 회원님들 더운데 건강관리 잘하셔서 별일 없으셨으면 하는 작은 바램이 있습니다.
: : : :
: : : : 이렇게 글을 적게 된 건 리눅스에 QT라는 개발툴이 있는데요
: : : :
: : : : QT 로 DLL 을 만들었습니다 그래서 테스트할겸 비주얼 스튜디오로 돌렸는데 아무 이상이 없었습니다
: : : :
: : : : 그런데 이 DLL 을 볼랜드로 가져오니까 대충
: : : :
: : : : Exception class EAccessViolation with message 'Access Violation'.
: : : :
: : : : 대충 저런 오류가 뜨는데 한줄 한줄 return 문 써서 확인하다보니
: : : :
: : : : new 에서 걸리더군요
: : : :
: : : : 제가 아는게 워낙 얕고 해서 회원님들께 여쭙습니다
: : : :
: : : : 볼랜드에서는 dll 안에 new 하는게 허용되지 않는가요?
: : : :
: : : : 혹시 아시는분 있으시면 답변 주시면 감사합니다
: : : :
: : : : 더운데 프로그램 작업하시느라 수고 많으십니다 회원님들이 원하는 결과를 얻길 빌며 글을 줄이겠습니다
: : : :
: : : : 덧붙임 : 제가 DLL 을 가져와서 사용하려는 프로그램을 작성하는 개발툴은 RAD Studio 2010 입니다
: :
: :
: :
: : 답변 주셔서 일단 감사드립니다
: :
: : 제가 진짜 잘 모르겠는데요 테스트 할겸 프로젝트를 생성하였습니다 염치 없지만 한번 봐주시고 이상한거 있는지 봐주시면 정말 도움이 많이 될거 같습니다
: :
: : 일단 DLL 프로젝트입니다
: : ///////////////////////////////////////////////////////////////////////////////
: : newindll_testproject.h
: :
: : #ifndef NEWINDLL_TESTPROJECT_H
: : #define NEWINDLL_TESTPROJECT_H
: :
: : #include "newindll_testProject_global.h"
: :
: : extern "C" class NEWINDLL_TESTPROJECTSHARED_EXPORT Newindll_testProject {
: : public:
: :     Newindll_testProject();
: :     char *p;
: : };
: :
: : extern "C" NEWINDLL_TESTPROJECTSHARED_EXPORT int test();
: :
: : #endif // NEWINDLL_TESTPROJECT_H
: : ////////////////////////////////////////////////////////////////////////////////
: : newindll_testproject_global.h
: :
: : #ifndef NEWINDLL_TESTPROJECT_GLOBAL_H
: : #define NEWINDLL_TESTPROJECT_GLOBAL_H
: :
: : #include <QtCore/qglobal.h>
: :
: : #if defined(NEWINDLL_TESTPROJECT_LIBRARY)
: : #  define NEWINDLL_TESTPROJECTSHARED_EXPORT Q_DECL_EXPORT
: : #else
: : #  define NEWINDLL_TESTPROJECTSHARED_EXPORT Q_DECL_IMPORT
: : #endif
: :
: : #endif // NEWINDLL_TESTPROJECT_GLOBAL_H
: : /////////////////////////////////////////////////////////////////////////////////
: : newindll_testproject.cpp
: :
: : #include "newindll_testproject.h"
: :
: :
: : Newindll_testProject::Newindll_testProject()
: : {
: : //    p = new char[10];
: : }
: :
: : extern "C" NEWINDLL_TESTPROJECTSHARED_EXPORT int test()
: : {
: :     char *p;
: :     p = new char[10];
: :     return 0;
: : }
: : //////////////////////////////////////////////////////////////////////////////////
: : 이렇게 빌드하였구요 빌드한 컴파일러는 MSVC 2008 버전입니다
: :
: : 위에 DLL 을 가져다 쓴 소스는
: : /////////////////////////////////////////////////////////////////////////////////
: : File1.cpp
: :  //---------------------------------------------------------------------------
: : #include <vcl.h>
: : #pragma hdrstop
: : #include <tchar.h>
: : //---------------------------------------------------------------------------
: : #include <stdio.h>
: :
: : typedef void *HANDLE;
: :
: :
: : typedef int (__stdcall *g_test)();
: :
: : typedef int (__stdcall *g_test)();
: :
: : extern "C" __declspec(dllimport) void __stdcall test();
: :
: : #pragma argsused
: :
: : int _tmain(int argc, _TCHAR* argv[])
: : {
: :     bool bResult=false;
: :     HMODULE hDll;
: :
: :
: :     hDll = LoadLibraryEx("newindll_testProject.dll", NULL, DONT_RESOLVE_DLL_REFERENCES);
: :     if(hDll == NULL)
: :     {
: :         printf("[Err] Fail to get dll [%d]\n", GetLastError());
: :         return -1;
: :     }
: :     g_test test;
: :     test = (g_test) GetProcAddress(hDll, "test");
: :     if(test == NULL) printf("Fail to get test\n");
: :     else    printf("Success to get test\n");
: :     test();
: :     FreeLibrary(hDll);
: :     return 0;
: : }
: : ////////////////////////////////////////////////////////////
: :
: : 이렇게 입니다 MSVC2008 을 통해 빌드한 DLL 은 implib 라는 파일을 이용해 lib 를 생성하고 프로젝트에 추가하였습니다
: :
: : 그런데 오류가 Exception class EAccessViolation with message 'Access Violation'.  역시나 이렇게 발생합니다
: :
: : 제가 혹여나 빠뜨린거 있는지요..?
: :
: : 답변주시면 정말 큰힘이 될듯 합니다.

우선 답변 주셔서 매우매우 감사합니다 제가 아는 지식이 너무 얕아서 생긴 문제인데 친절히 답변 주셔서 매우 감사합니다

마지막으로 하나 더 여쭙고 싶습니다

Lyn 님께서 말씀해주신대로 함수를 아래와 같이 변경하였습니다


extern "C" __declspec(dllexport) int __stdcall test()
{
    char *p;
    p = new char[10];
    return 0;
}


이런식으로 말이죠

이런식으로 하니 getprocaddress 에서 함수를 못찾습니다

그래서

extern "C" __declspec(dllexport) int __cdecl test()
{
    char *p;
    p = new char[10];
    return 0;
}

이렇게 DLL 을 만들었습니다

dll 을 lib 만들때는 imp newindll_testProject newindll_testProject.dll

이렇게 lib를 만드니 getprocaddress 는 넘어가는 군요

여전히 new 부분에서 뻗습니다

본의아니게 제가 게시판을 도배해서 죄송합니다

제 무지가 이렇게 창피할때는 처음이네요

+ -

관련 글 리스트
67426 DLL 안에서 NEW를 하면 원래 오류가 나는건가요? 김보람 1004 2012/06/07
67427     Re:DLL 안에서 NEW를 하면 원래 오류가 나는건가요? Lyn 993 2012/06/07
67428         Re:Re:DLL 안에서 NEW를 하면 원래 오류가 나는건가요? 김보람 1068 2012/06/07
67430             Re:Re:Re:DLL 안에서 NEW를 하면 원래 오류가 나는건가요? Lyn 1149 2012/06/07
67431                 Re:Re:Re:Re:DLL 안에서 NEW를 하면 원래 오류가 나는건가요? 김보람 1100 2012/06/07
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.