|
funji 님이 쓰신 글 :
: 님이 쓰신 글 :
: : 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 이네요
: : 같아야 되지 않을가요?..
: : :
:
extern "C" __declspec(dllimport) TGlobalDLLData *__stdcall GetDLLData();
void __fastcall InitGlobalDLLData()
이 두부분을 보세요
__stdcall __fastcall 두가지가있네요
이두부분이 달라지면 가저올때 못가저와요 이두부분이 일치해야됩니다
이두부분이다르니 에러를 발생하죠
|