해결된 질문
작성
·
354
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로 나와서 실행이 안됩니다.
현재까지 확인된 내용
Hin(LoadLibraryA) 모듈 핸들을 얻었는 데 NULL은 안 뜨나 디버깅을 했더니
This Program cannot be run in Dos mode 라고 나옵니다.
dllfun(GetProcAddress로 얻은 함수 주소)은 NULL이 확실합니다.
밑에 코드 몇번 변경하면서 확인 됬습니다.
GetLastError()을 dllfun()에 127(지정된 프로시저를 찾을 수 없습니다."라는 오류가 생성됩니다.)이 나옵니다
현재까지 시도
경로 조정 절대경로, 상대 경로 다해봤습니다.
함수 이름 변경
extern "C" ~ 이것도 파일 양쪽에 다 넣어보고 한쪽에도 넣어보고 했습니다.
구글 검색해도 원하는 내용이 안나옵니다.
Hin의 자료 형을 HMODULE, HINSTANCE 다해봤습니다.
환경변수 조정
v3에 걸려서 꺼보고 실행
exe 파일위치를 기준으로 경로 조정
빌드도 해봤는데 안됩니다.
대략 이 정도 입니다.
원인이랑 해결방법이 궁금 합니다.
답변 2
0
여러 원인이 있을 수 있겠으나 DLL 프로젝트를 생성할 때 MFC 확장 DLL로 만든 것이 아닌가 싶습니다. 일반적인 레귤러 DLL이 아니라 MFC 확장의 경우 콘솔 응용 프로그램에서 작동하지 못합니다. 그래서 DOS 모드에서 작동할 수 없다는 메시지도 나온 것으로 추측 됩니다. 그러므로 DLL 프로젝트를 다시 생성한 후 테스트 해보시기 바랍니다. 😄
0
안녕하세요, 인프런 AI 인턴입니다.
DLL 명시적 링크에서 발생하는 문제와 관련해 오류 코드 127은 “지정된 프로시저를 찾을 수 없습니다.“라는 의미입니다. 이 문제가 발생하는 주된 원인은 GetProcAddress
함수가 DLL 내에서 지정한 함수를 찾지 못했기 때문입니다. 문제 해결을 위해 아래 몇 가지 사항을 확인해보시기 바랍니다.
함수 이름 확인: GetProcAddress
함수에 전달하는 함수 이름이 DLL 파일 내에서의 실제 이름과 정확히 일치하는지 확인해주세요. C++에서는 이름 장식(name mangling)으로 인해 함수명이 변경될 수 있습니다. 또한, extern "C"
를 사용하여 C 언어 링킹 규칙을 사용함으로써 이름 장식을 방지할 수 있지만, 이 경우 양쪽 모두에 extern "C"
가 정확히 적용되었는지 확인하십시오.
DLL 파일 빌드 확인: DLL 파일이 올바르게 빌드되었는지 확인해주십시오. 특히, DllFunction
함수가 올바르게 export 되었는지 확인하기 위해 DLL 파일을 검사할 수 있는 도구(예: Dependency Walker, DLL Export Viewer)를 사용해 보십시오.
경로 문제: LoadLibrary
호출 시 정확한 경로를 사용하고 있음에도 불구하고, 여전히 문제가 발생한다면, DLL 파일이 의존하는 다른 파일들이 모두 올바른 위치에 있는지 확인해보십시오.
프로젝트 설정: 사용하는 개발 환경(예: Visual Studio)에서 프로젝트의 대상 플랫폼 설정(32비트 vs. 64비트)이 일치하는지 확인하십시오. 호출하는 애플리케이션과 DLL이 같은 아키텍처에서 빌드되어야 합니다.
재컴파일: 코드 변경 후에는 DLL과 호출하는 애플리케이션 모두를 재컴파일하십시오.
위 사항을 모두 확인해보셨음에도 불구하고 문제가 해결되지 않는다면, 추가적으로 DLL과 관련된 세부 오류 메시지를 포함한 로그 정보를 확인해 볼 수 있습니다. Developer Command Prompt 같은 도구를 사용하여 빌드 과정에서 발생하는 경고나 에러 메시지를 자세히 살펴보십시오.