typedef struct
{
// The contents of this struct are platform-dependent and subject to
// change. You should not manipulate the contents of this struct directly.
/*New stuff*/
// HWND m_hWnd;
// HDEVNOTIFY m_hDevNotify;
} fdGlove;
FGLOVEAPI fdGlove *fdOpen(char *pPort, bool bOnlyAllowSingleConnection = false);
FGLOVEAPI int fdClose(fdGlove *pFG);
FGLOVEAPI int fdGetGloveHand(fdGlove *pFG);
FGLOVEAPI int fdGetGloveType(fdGlove *pFG);
我有一个名为fglove.dll的DLL文件,我需要使用C#来调用它。 我写了这样的代码:
[StructLayout(LayoutKind.Sequential)]
public class fdGlove
{
}
[DllImport("fglove.dll")]
public static extern fdGlove fdOpen(string pPort, bool bOnlyAllowSingleConnection);
但是当我调试程序时它有一个错误(无法在DLL'fglove.dll'中找到名为'fdOpen'的入口点。)
有人可以指出我做错了吗?
答案 0 :(得分:3)
fdOpen正在使用默认参数 - 这只能意味着您正在尝试从DLL中导出C ++函数。结果是“fdOpen”在导出表中被“名称损坏”,看起来像“fdOpen @ YAXPB_W0I @ Z”。
最好将此函数导出为C.声明并定义fdOpen,如下所示:
extern "C" fdGlove* __stdcall fdOpen(char* pPort, bool bOnlyAllowSingleConnection);
其他可能的问题:
DLL与尝试加载它的EXE不在同一目录中。
您忘记从DLL导出该函数。您需要在函数定义中使用.DEF文件或__declspec(dllexport)属性。使用“dumpbin / exports fglove.dll”来判断是否是这种情况。
stdcall和cdecl编译选项之间的混淆。我感到困惑,所以尝试将“_ stdcall”替换为上面的“ _cdecl”。或者尝试没有任何属性。
答案 1 :(得分:1)
fglove的编译器最有可能进行名称修改。
使用DUMPBIN fglove.dll
获取真实姓名。
然后使用[DllImport("fglove.dll", EntryPoint='...')]
,其中......是真实姓名。
答案 2 :(得分:0)
查看Dependency Walker中导出符号的名称。它很可能是_fdImport或类似的东西,你需要更新你的DLLImportAttribute以匹配导出的名称。