inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Windows 시스템 프로그래밍 - 기본

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

해결된 질문

966

유용

작성한 질문수 3

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. 빌드도 해봤는데 안됩니다.

대략 이 정도 입니다.

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

 

 

c system-programming vc++

답변 2

0

널널한 개발자

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

0

인프런 AI 인턴

안녕하세요, 인프런 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 같은 도구를 사용하여 빌드 과정에서 발생하는 경고나 에러 메시지를 자세히 살펴보십시오.

세마포어 개수에 따른 스레드 점유상태

0

61

2

메모리 맵과 비동기 입/출력 조합 #2 수업내용에 질문있습니다.

0

95

2

힙 메모리 블럭 관리 방법 질문

0

97

2

MapViewOfFile 원리 관련 질문있습니다

0

102

1

가상 메모리 시스템 영역 구분

0

96

2

스택 크기 결정 단계

0

75

2

시스템프로그래밍-응용편

0

130

2

바이트와 관련된 유튜브 영상을 못 찾겠어요ㅠㅠ

0

94

2

파일 복사에 관한 질문입니다

0

114

2

세마포어 예제에 대한 질문이 있습니다.

0

110

2

메모장 쓰레기값 ?

0

133

2

64 bit 운영체제라면 가상메모리가

0

180

2

alertable Wait 상태 질문있습니다

0

226

1

GetCurrentDirectory 관련 질문

0

169

2

세마포어 예제중 형변환에 대한 질문

0

162

2

강사님 dll 지연로딩 관련하여 질문 드립니다

0

205

3

선장님 , _beginThreadEx() 함수 원리는 어디서 정보를 얻을 수 있을까요?

0

286

2

메모리 맵 강의 예제의 결과가 이상합니다.

0

227

1

강사님 파일입출력(Callback함수)와 관련하여 질문 드립니다.

0

348

2

static 영역의 rw 가능한 곳은 어떤 데이터가 담기는지 궁금합니다.

0

223

1

TerminanteProcess 와 관련하여 질문 드립니다.

0

172

1

강사님 스레드 관련 질문 드립니다.

0

226

1

강사님 메뉴얼 중 이것도 궁금해서 여쭤봅니다.

0

210

2

강사님 프로세스의 IPC에서 굳이 MUTEX 가 필요할까 하는 생각이 듭니다.

1

372

4