Визуальное искажение имен в Visual C ++ 6.0, даже внутри extern "C" и dllexport, заглушки RPC не генерируются - PullRequest
2 голосов
/ 21 сентября 2011

Эй, ребята, я работаю над созданием новой функции в устаревшем визуальном проекте C ++ 6.0 dll, чтобы можно было вызывать C # dll, однако я не могу этого сделать из-за искажения имени, и, кажется, что я не могу,Остановите это (я использовал dumpbin для просмотра имен) вот соответствующий код

это действительно урезанная версия файла заголовка

#ifdef  _V7SSCOMM_CPP_
#define _DECL_V7COMM_DLL    __declspec(dllexport)
#else
#define _DECL_V7COMM_DLL    __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C" {
#endif
_DECL_V7COMM_DLL    DWORD V7ssGetFileDirInfoUnicode(LPCSTR szSign, V7_FILE_LIST_TYPE eListType, LPCSTR szServer, LPCSTR szLibrary, LPCSTR szExt, DWORD *pdwFileCnt, wchar_t *pbyFileBuf, DWORD *pdwFileBufSize);

#ifdef __cplusplus
}
#endif

#endif

и для файла cpp

_DECL_V7COMM_DLL    DWORD V7ssGetFileDirInfoUnicode(LPCSTR szSign, 
                                                         V7_FILE_LIST_TYPE eListType, 
                                                         LPCSTR szServer, LPCSTR szLibrary, LPCSTR szExt, 
                                                         DWORD *pdwFileCnt, wchar_t *pbyFileBuf, DWORD *pdwFileBufSize)
{
    if (!szSign || !szServer || !szLibrary || !szExt || !pdwFileCnt || !pbyFileBuf || !pdwFileBufSize)
        return (RPC_S_INVALID_ARG);

    error_status_t Error = rpcGetFileDirInfoUnicode(
        /* [in] */ g_hRpcBinding, 
        /* [in, string] */ (unsigned char *)szSign, 
        /* [in] */ (unsigned long)eListType, 
        /* [in, string] */ (unsigned char *)szServer,
        /* [in, string] */ (unsigned char *)szLibrary,
        /* [in, string] */ (unsigned char *)szExt,
        /* [out] */ (unsigned long *)pdwFileCnt, 
        /* [out, size_is(*pdwFileBufSize)] */ (wchar_t *)pbyFileBuf, 
        /* [in, out] */ (unsigned long *)pdwFileBufSize);

    return (Error);
} // end V7ssGetFileDirInfoUnicode()

dumpbin возвращает следующее 1 0 00001401? V7ssGetFileDirInfoUnicode @@ YAKPBDW4tag_V7_FILE_LIST_TYPE @@ 000PAKPAG2 @ Z

не то, что я в идеале хотел бы, это будет только * V7ssGetFileD_fileFileD:Из того, что я читал, я могу судить, как я пытаюсь это сделать, и это означает, что мне не нужно определять это в файле .def.Что странно, я следую той же настройке extact, что и ранее существующие функции, которые отображаются правильно.

Буду признателен за любую помощь. Спасибо!

Обновление

опция файла .def работает, если не указывать имена, то есть, учитывая, что компилятор MIDL не создает заглушку RPC, я думаю, что эти две проблемы связаны.

также здесьMIDL-версия, взятая из файла C iteself

/* this ALWAYS GENERATED file contains the RPC server stubs */


/* File created by MIDL compiler version 5.01.0164 */
/* at Wed Sep 21 08:57:22 2011
 */
/* Compiler settings for V7Rpc.idl:
    Os (OptLev=s), W1, Zp8, env=Win32, ms_ext, c_ext
    error checks: allocation ref bounds_check enum stub_data 
*/
//@@MIDL_FILE_HEADING(  )

1 Ответ

3 голосов
/ 21 сентября 2011

Если вы уверены, что включили заголовочный файл из файла .cpp, то вы можете попробовать добавить файл .def в свой проект. Могут быть и другие пути, но это всегда, казалось, играет важную роль в сокращении искажения имени в экспорте. Содержание будет выглядеть примерно так.

EXPORTS
   V7ssGetFileDirInfoUnicode
...