|
님이 쓰신 글 :
: funji 님이 쓰신 글 :
: : 제가 지금 SharedData.dll을 LoadLibraryA()를 사용하여 로드를 하려고 합니다.
: : 근데 Build all은 되는데 컴파일이 안되서 이렇게 글을 남깁니다.
: : 컴파일을하면 EOutOfResources 에러가나는데
: : 이 에러가 왜 발생하는지 감을 못 잡겠습니다...
: :
: :
: : SharedData.cpp는 Q&A를 보고 변수명만 바꿔줬고요..
: : ======================= SharedData.cpp =======================================
: : #include <Vcl.Dialogs.hpp>
: :
: : #pragma hdrstop
: :
: : #include "DLLDATA.hpp"
: :
: : #pragma data_seg(".Shared")
: : pGD GD = NULL;
: : int SharedDataCount = 0;
: : #pragma data_seg()
: :
: : HANDLE MapHandle;
: :
: : #pragma argsused
: :
: : extern "C" __declspec(dllimport) TGlobalDLLData *__stdcall GetDLLData()
: : {
: : return GD;
: : }
: :
: : /*
: :
: : 메모리 맵을 생성한다.
: :
: : */
: :
: : void CreateSharedData()
: : {
: : int size = sizeof(TGlobalDLLData);
: :
: : MapHandle = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, size, MMFileName);
: :
: : if ( MapHandle == NULL )
: : {
: : ShowMessage("Unable to create file mapping !");
: : return;
: : }
: :
: : GD = (TGlobalDLLData *)MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, size);
: :
: : memset(GD,0,sizeof(TGlobalDLLData));
: :
: : if (GD == NULL)
: : {
: : CloseHandle(MapHandle);
: : ShowMessage("Unable to map view of file. Error : " + GetLastError());
: : }
: : }
: :
: : /*
: :
: : 메모리 맵에 매핑된 공유 데이터를 연다.
: :
: : */
: :
: : void OpenSharedData()
: : {
: : int size = sizeof(TGlobalDLLData);
: :
: : MapHandle = OpenFileMapping(FILE_MAP_ALL_ACCESS, false, MMFileName);
: :
: : if ( MapHandle == NULL )
: : {
: : ShowMessage("Unable to Open file mapping !");
: : return;
: : }
: :
: : GD = (TGlobalDLLData *)MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, size);
: :
: : if ( GD == NULL )
: : {
: : CloseHandle(MapHandle);
: : ShowMessage("Unable to map view of file. Error : " + GetLastError());
: : }
: : }
: :
: :
: : /*
: :
: : 공유된 메모리맵과 핸들을 닫는다.
: :
: : */
: :
: : void CloseSharedData()
: : {
: : UnmapViewOfFile(GD);
: : CloseHandle(MapHandle);
: : }
: :
: :
: : extern "C" int _libmain(unsigned long reason)
: : {
: : switch(reason)
: : {
: : case DLL_PROCESS_ATTACH :
: : if ( SharedDataCount == 0 ) // 대신 CreateFileMapping 의 에러 반환 값인
: : { // ERROR_ALREADY_EXIST 를 이용 가지를 쳐도 상관엄따....
: : CreateSharedData(); // Win32 DLL 의 특성상 자체 레퍼런스 카운트가 있으나
: : SharedDataCount ++;
: : }
: : else
: : {
: : OpenSharedData();
: : SharedDataCount ++;
: : }
: : break;
: :
: :
: : case DLL_PROCESS_DETACH :
: : CloseSharedData();
: : SharedDataCount --;
: : break;
: : }
: :
: : return true;
: : }
: :
: : SharedData.cpp 로드하는 부분은 이렇게 작성하였습니다.
: : ==================================Unit2.h======================================
: :
: :
: : #ifndef Unit2H
: : #define Unit2H
: :
: : #include <Vcl.Dialogs.hpp>
: : #include "DLLDATA.hpp"
: : //---------------------------------------------------------------------------
: : pGD GD; // Global DLL Share Data
: :
: : void __fastcall InitGlobalDLLData();
: : #endif
: :
: :
: : ==================================Unit2.cpp======================================
: : #pragma hdrstop
: :
: : #include "Unit2.h"
: : //---------------------------------------------------------------------------
: : #pragma package(smart_init)
: :
: : HINSTANCE ShareData;
: :
: : typedef TGlobalDLLData * (*GDReturnFunc_m)();
: :
: : extern "C" __declspec(dllimport) TGlobalDLLData *__stdcall GetDLLData();
: :
: : void __fastcall InitGlobalDLLData()
: : {
: : ShareData = LoadLibraryA("SharedData.dll"); // ShareData.dll 불러옴
: : if (!ShareData) {
: : //ShowMessage("ShareData.dll not loaded");
: : }
: : else
: : {
: : GDReturnFunc_m GetDLLData;
: : //GetProcAddress 'SharaData.dll'에 있는 명령어를 가져와 함수포인터에 연결 시켜줌
: : GetDLLData = (GDReturnFunc_m)GetProcAddress(ShareData, "GetDLLData");
: : GD = GetDLLData();
: : }
: : FreeLibrary(ShareData);
: : }
: :
: : 프로젝트 옵션은 Linker의 Dynamic RTL나 RuntimePakage은 false으로적용 했구요...
: : parmeters는 살행파일 exe파일로 설정해놓고 SharedData.dll의 path주소는 실행파일이 있는 디버깅파일로 잡아주었습니다.
: :
: : 몇일동안 이문제로 골머리는 썩고있는거같아요.. 정말 도움의 손길 부탁드립니다.
:
: 함수 엔 __fastcall 인데 extern 부분엔 _stdcall 이네요
: 같아야 되지 않을가요?..
: :
GetDLLData()함수 앞에는 다 __stdcall로 되어있고
InitGlobalDLLData() 앞에 __fastcall로 되어있어요 ㅠㅠㅠㅠ
|