C++에서 DLL을 동적으로로드해야합니다.C++ GetProcAddress()에서 정적 클래스의 메서드를 찾을 수 없습니다.
나는이 튜토리얼 http://msdn.microsoft.com/en-us/library/ms235636.aspx을 따라 dll을 만들고 모든 것이 잘 동작했다.
그럼 나는이 일 http://msdn.microsoft.com/en-us/library/64tkc9y5.aspx을 따라 나는 다음과 같이 콘솔 응용 프로그램을 채택했습니다typedef DOUBLE(CALLBACK* DllFunc)(DOUBLE, DOUBLE);
int _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE hDLL; // Handle to DLL
DllFunc dllFunc1;
DOUBLE p1 = 1.0, p2 = 2.0, r;
hDLL = LoadLibrary(L"MathFuncsDLL");
if (hDLL != NULL)
{
cout << "DLL loaded: " << hDLL << endl;
dllFunc1 = (DllFunc)GetProcAddress(hDLL, "[email protected]@Multiply");
if (!dllFunc1)
{
// handle the error
FreeLibrary(hDLL);
cout << "Function not found!" << endl;
return -1;
}
else
{
// call the function
r = dllFunc1(p1, p2);
cout << "The result is: " << r << endl;
}
}
else {
cout << "Dll not found" << endl;
return -1;
}
cout << "Press any key to exit." << endl;
int i;
cin >> i;
return 0;
}
DLL이 제대로 넣었는지, 그것이 null이 아닙니다. 문제는 항상 0을 반환하는 GetProcAddress() 함수입니다.
모든 네임 스페이스, 클래스 이름, 메서드 이름 조합을 시도했습니다. 함수 이름에 @ 대신 범위 연산자 (: :)를 사용하려고했습니다.
전체 네임 스페이스를 extern "C" 으로 정의하려고했지만 아무 것도 변경되지 않았습니다. 콘솔 응용 프로그램을 실행하거나 디버깅 할 때마다 '곱하기'기능을 찾을 수 없습니다.
내가 뭔가를 놓치고 있다고 생각합니다 ... 어디에서 잘못 되었나요? 하지 왜 ...
가 지금은 함수 이름의 마지막 부분이 무엇을 의미하는지 궁금 을 :
편집
종속성 워커는 나에게 다음과 같은 내보내기 테이블을 노출 __declspec (dllexports)는 이러한 기호를 추가합니까?
이 DLL의 기호를 덤프하고 추가하십시오 :
는이 인터페이스 클래스를 선언하는 적절한 방법입니다. – Deduplicator
그 이름을 어디에서 얻었는지 짐작하기는 쉽지 않습니다. MSVC++ 컴파일러의 경우 "? Multiply @ MyMathFuncs @ MathFuncs @@ SANNN @ Z"가되어야합니다. DLL에서 Dumpbin.exe/exports를 사용하여 이름을 확인하십시오. DLL 프로젝트가 생성 한 .lib 파일을 링크하여 이런 일을하지 않아도됩니다. –
질문을 내보내기 이름이 표시된 스크린 샷으로 업데이트했습니다. 틀림없이 우리는 끝났습니다. 너는 무엇을 더 기대하고 있니? –