Visual C ++ 6.0名称修改,即使在extern“C”和dllexport中,RPC Stubs也没有生成

时间:2011-09-21 13:51:22

标签: visual-c++ rpc extern dllexport name-mangling

嘿伙计们正致力于在遗留的Visual 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

不是我想要的理想情况下它只会是V7ssGetFileDirInfoUnicode

据我所知,我一直在阅读的方式我尝试这样做意味着我不需要在.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 个答案:

答案 0 :(得分:3)

如果您确定包含了.cpp文件中的头文件,那么您可以尝试将.def文件添加到项目中。可能还有其他方法,但这似乎一直是减少出口名称损失的关键部分。内容看起来像这样。

EXPORTS
   V7ssGetFileDirInfoUnicode