|
제가 지금 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주소는 실행파일이 있는 디버깅파일로 잡아주었습니다.
몇일동안 이문제로 골머리는 썩고있는거같아요.. 정말 도움의 손길 부탁드립니다.
|