기능 포인터를 DLL 함수에 인수하여 DLL 내부에서 호출하는 것이 안전합니까?

StackOverflow https://stackoverflow.com/questions/653697

문제

일부 (DLL이든 아니든) 기능 포인터를 일부 DLL 함수에 인수로 전달하고 DLL 내부에서 호출하고 싶습니다. 정보를 찾았 기 때문에 안전한지 궁금합니다. http://publib.boulder.ibm.com/infocenter/zos/v1r10/index.jsp?topic=/com.ibm.zos.r10.cbcpx01/fpref.htm 저것:

DLL 코드에서는 함수 포인터가 함수 디스크립터를 가리키는 것으로 가정합니다. 기능 포인터 호출은 먼저 포인터를 해독하여 기능 주소를 얻음으로써 이루어집니다. 그런 다음 함수 항목으로 분기됩니다. 비 DLL 기능 포인터가 DLL 코드로 전달되면 기능 항목을 직접 가리 킵니다. 그러한 포인터를 통해 불평하려는 시도는 정의되지 않은 함수 주소를 생성합니다. 정의되지 않은 주소로의 후속 분기는 예외를 초래할 수 있습니다.

이 규칙은 Visual Studio 및 기타 컴파일러에도 적용됩니까?

정확하게 내가하려는 것은 다양한 DLL과 비 DLL 함수 간의 메모리 할당 및 거래 문제를 해결하는 것입니다. 내 아이디어는 공통 초기화 (예 : 초기화 (& malloc, & free))의 모든 DLL에 공통 할당 및 거래 함수를 위해 두 가지 함수 포인터를 전달한 다음 이러한 공통 및 항상 호환되는 기능을 사용하여 모든 메모리 관리를 수행하는 것입니다.

도움이 되었습니까?

해결책

그것은 사실이 아닙니다. DLL 코드는 DLL 코드와 정확히 같은 방식으로 함수 포인터를 취급합니다. 그렇지 않은 경우 DLL 내에서 QSORT () (함수 포인터 인수를 기대하는)와 같은 표준 라이브러리 기능을 사용할 수 없습니다.

다른 팁

기능 포인터를 DLL에 전달하는 것은 여러 세대 동안 수행되었습니다.

GUI 프로그래밍에 사용 된 모든 콜백 기능 (예 : 진행률 표시 줄 업데이트)은 기능 포인터를 사용합니다.

Win32를 사용하여 개발할 때 Malloc/Free에 기능 포인터를 사용하려는 이유가 있습니까? Malloc/Free를 직접 사용하지 않는 이유는 무엇입니까?

그것이 내가 과거에 항상 그것을 한 방식입니다. 이것이 올바른 방법을 보장하지는 않습니다.
사실, 당신은 그것을 최악의 방법이라는 표시로 받아 들일 수 있습니다 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top