2011-10-12 4 views
0

함수 포인터와 LoadLibrary를 사용하고 있습니다. 다음은 내 코드입니다. 내가 _EvtSubscribe 전화 후에 EvtExportLog을 추가했을 때 _EvtSubscribe 값이 손상되기 시작했습니다. 다음 코드에서 다했듯이 이전에 추가 한 코드는 모두 정상적으로 작동합니다. 다른 기능 포인터를 추가하면 같은 문제에 직면하게됩니다. 아무도 문제가 될 수 있습니다. .함수 포인터와 dll로드 순서

 HMODULE module = LoadLibrary(L"wevtapi.dll"); 
    _EvtExportLog    = (BOOL (WINAPI *)(EVT_HANDLE ,LPCWSTR ,LPCWSTR ,LPCWSTR ,DWORD))GetProcAddress(module, "EvtExportLog"); 
    _EvtClearLog    = (BOOL (WINAPI *)(EVT_HANDLE ,LPCWSTR,LPCWSTR,DWORD))GetProcAddress(module, "EvtClearLog"); 
    _EvtOpenLog    = (EVT_HANDLE (WINAPI *)(EVT_HANDLE ,LPCWSTR ,DWORD))GetProcAddress(module, "EvtOpenLog"); 
    _EvtGetLogInfo   = (BOOL (WINAPI *)(EVT_HANDLE, EVT_LOG_PROPERTY_ID, DWORD, PEVT_VARIANT ,PDWORD))GetProcAddress(module, "EvtGetLogInfo"); 
    _EvtQuery     = (EVT_HANDLE (WINAPI *)(EVT_HANDLE,LPCWSTR ,LPCWSTR ,DWORD))GetProcAddress(module, "EvtQuery"); 
    _EvtNext     = (BOOL (WINAPI *)(EVT_HANDLE ,DWORD,EVT_HANDLE*,DWORD,DWORD,PDWORD))GetProcAddress(module, "EvtNext"); 
    _EvtClose     = (BOOL (WINAPI *)(EVT_HANDLE))GetProcAddress(module, "EvtClose"); 
    _EvtCreateRenderContext = (EVT_HANDLE (WINAPI *)(DWORD, LPCWSTR *, DWORD))GetProcAddress(module, "EvtCreateRenderContext"); 
    _EvtFormatMessage   = (BOOL (WINAPI *)(EVT_HANDLE, EVT_HANDLE, DWORD, DWORD, PEVT_VARIANT, DWORD, DWORD, LPWSTR, PDWORD))GetProcAddress(module, "EvtFormatMessage"); 
    _EvtOpenPublisherMetadata = (EVT_HANDLE (WINAPI *)(EVT_HANDLE, LPCWSTR, LPCWSTR, LCID, DWORD))GetProcAddress(module, "EvtOpenPublisherMetadata"); 
    _EvtRender    = (BOOL (WINAPI *)(EVT_HANDLE, EVT_HANDLE, DWORD, DWORD, PVOID, PDWORD, PDWORD))GetProcAddress(module, "EvtRender"); 
    _EvtSubscribe    = (EVT_HANDLE (WINAPI *)(EVT_HANDLE, HANDLE, LPCWSTR, LPCWSTR, EVT_HANDLE, PVOID, EVT_SUBSCRIBE_CALLBACK, DWORD))GetProcAddress(module, "EvtSubscribe"); 
+0

문제는 아마도 주문과 관련이 없습니다. 문제가이 코드와 전혀 관련이 없다면 기능 서명이 잘못되었을 가능성이 큽니다. – tenfour

답변

3

이 DLL로드하기 위해, 당신은 다른 곳 스택을 부수고하고 함께 할 수 없다, 단지 _EvtSubscribe 당신이 스택에 객체를 주문하는 방법에 따라 피해자임을 발생합니다. 스택을 쓰레기로 버리는 가장 쉬운 방법은 틀린 서명으로 함수를 호출하는 것입니다. 정적 링크와 헤더를 사용하는 대신 수작업으로 문자를 복사하는 것이 좋습니다.