• 카테고리

    질문 & 답변
  • 세부 분야

    데스크톱 앱 개발

  • 해결 여부

    해결됨

dll 명시적 링크 오류 (원인 및 해결 방법이 필요 합니다)

24.04.22 18:30 작성 조회수 57

0

DLL 명시적 링크에서 파일 오류가 생기는데 해결이 안됩니다.

구글 검색이랑 여기저기 다 해봤는데 나오는 게 없어서 질문 합니다.

일단 코드 입니다. 질문 내용은 코드 밑에 다가 적어 두겠습니다.

DLL 파일 이름 = Dll1.dll

main 파일 이름 = dlltest.cpp

경로는 강의와 동일 합니다.

 

main() 파일

#include <iostream>

#include <Windows.h>

#include <tchar.h>

using namespace std;

//void WINAPI DllTestFunction(int pParam);

int main()

{

HINSTANCE Hin = ::LoadLibraryA("..\\x64\\Debug\\Dll1.dll");

DWORD Error1 = ::GetLastError();

if (Hin == NULL)

{

printf("falied LOADLIBARARY");

}

DWORD(WINAPI * dllfun)(void) = NULL;

dllfun = (DWORD (WINAPI*)(void)) ::GetProcAddress(Hin, "DllFunction");

Error1 = ::GetLastError();

std::cout << Error1 << std::endl;

dllfun();

if (dllfun == NULL)

{

std::cout<<"failed dllfun()"<<std::endl;

wprintf(_T("falied dllfun()"));

return 0;

}

std::cout << "ddd" << std::endl;

FreeLibrary(Hin);

return 0;

}

 

 

DLL 파일

 

#include "pch.h"

#include<stdio.h>

#include<Windows.h>

#include<iostream>

#include<tchar.h>

#pragma once

extern "C" __declspec(dllexport) DWORD WINAPI DllFunction(void);

DWORD WINAPI DllFunction(void);

BOOL APIENTRY DllMain( HMODULE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved

)

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

break;

}

return TRUE;

}

DWORD WINAPI DllFunction(void)

{

wprintf(_T("DLL TEST: DllTestFunction(param:)"));

std::cout << "failed DLLfun dllfun()" << std::endl;

return 0;

}

 

현재 증상

dllfun(GetProcAddress로 얻은 함수 주소)가 자꾸 NULL로 나와서 실행이 안됩니다.

 

현재까지 확인된 내용

  1. Hin(LoadLibraryA) 모듈 핸들을 얻었는 데 NULL은 안 뜨나 디버깅을 했더니

This Program cannot be run in Dos mode 라고 나옵니다.

  1. dllfun(GetProcAddress로 얻은 함수 주소)은 NULL이 확실합니다.

     

    밑에 코드 몇번 변경하면서 확인 됬습니다.

  2. GetLastError()을 dllfun()에 127(지정된 프로시저를 찾을 수 없습니다."라는 오류가 생성됩니다.)이 나옵니다

     

현재까지 시도

  1. 경로 조정 절대경로, 상대 경로 다해봤습니다.

  2. 함수 이름 변경

  3. extern "C" ~ 이것도 파일 양쪽에 다 넣어보고 한쪽에도 넣어보고 했습니다.

  4. 구글 검색해도 원하는 내용이 안나옵니다.

  5. Hin의 자료 형을 HMODULE, HINSTANCE 다해봤습니다.

  6. 환경변수 조정

  7. v3에 걸려서 꺼보고 실행

  8. exe 파일위치를 기준으로 경로 조정

  9. 빌드도 해봤는데 안됩니다.

대략 이 정도 입니다.

원인이랑 해결방법이 궁금 합니다.

 

 

답변 2

·

답변을 작성해보세요.

0

여러 원인이 있을 수 있겠으나 DLL 프로젝트를 생성할 때 MFC 확장 DLL로 만든 것이 아닌가 싶습니다. 일반적인 레귤러 DLL이 아니라 MFC 확장의 경우 콘솔 응용 프로그램에서 작동하지 못합니다. 그래서 DOS 모드에서 작동할 수 없다는 메시지도 나온 것으로 추측 됩니다. 그러므로 DLL 프로젝트를 다시 생성한 후 테스트 해보시기 바랍니다. 😄

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.04.24

안녕하세요, 인프런 AI 인턴입니다.

DLL 명시적 링크에서 발생하는 문제와 관련해 오류 코드 127은 “지정된 프로시저를 찾을 수 없습니다.“라는 의미입니다. 이 문제가 발생하는 주된 원인은 GetProcAddress 함수가 DLL 내에서 지정한 함수를 찾지 못했기 때문입니다. 문제 해결을 위해 아래 몇 가지 사항을 확인해보시기 바랍니다.

  1. 함수 이름 확인: GetProcAddress 함수에 전달하는 함수 이름이 DLL 파일 내에서의 실제 이름과 정확히 일치하는지 확인해주세요. C++에서는 이름 장식(name mangling)으로 인해 함수명이 변경될 수 있습니다. 또한, extern "C"를 사용하여 C 언어 링킹 규칙을 사용함으로써 이름 장식을 방지할 수 있지만, 이 경우 양쪽 모두에 extern "C"가 정확히 적용되었는지 확인하십시오.

  2. DLL 파일 빌드 확인: DLL 파일이 올바르게 빌드되었는지 확인해주십시오. 특히, DllFunction 함수가 올바르게 export 되었는지 확인하기 위해 DLL 파일을 검사할 수 있는 도구(예: Dependency Walker, DLL Export Viewer)를 사용해 보십시오.

  3. 경로 문제: LoadLibrary 호출 시 정확한 경로를 사용하고 있음에도 불구하고, 여전히 문제가 발생한다면, DLL 파일이 의존하는 다른 파일들이 모두 올바른 위치에 있는지 확인해보십시오.

  4. 프로젝트 설정: 사용하는 개발 환경(예: Visual Studio)에서 프로젝트의 대상 플랫폼 설정(32비트 vs. 64비트)이 일치하는지 확인하십시오. 호출하는 애플리케이션과 DLL이 같은 아키텍처에서 빌드되어야 합니다.

  5. 재컴파일: 코드 변경 후에는 DLL과 호출하는 애플리케이션 모두를 재컴파일하십시오.

위 사항을 모두 확인해보셨음에도 불구하고 문제가 해결되지 않는다면, 추가적으로 DLL과 관련된 세부 오류 메시지를 포함한 로그 정보를 확인해 볼 수 있습니다. Developer Command Prompt 같은 도구를 사용하여 빌드 과정에서 발생하는 경고나 에러 메시지를 자세히 살펴보십시오.