找不到PInvoke DLL – BUG?

我有Windows移动GPS第三方应用程序。这是代码包含GPS自动启用/禁用function的C ++代码。

我想制作DLL。 那也是我做的。 当用户点击发票(C#代码)GPS(C ++)必须找到。

这是我的源代码GPS.cpp

extern "C" //No name mangling __declspec(dllexport) #include "GPS.h" #include "stdafx.h" #include "RF PWR.h" #include "RF PWRDlg.h" #include "widioctl.h" #ifdef _DEBUG #define new DEBUG_NEW #endif void CaptureGPS() { HANDLE hDrv = CreateFile(TEXT("FNC1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (0 == DeviceIoControl(hDrv, IOCTL_WID_GPS_ON, NULL, 0, NULL, 0, NULL, NULL)) { RETAILMSG(1, (L"IOCTL_WID_RFID_ON Failed !! \r\n")); return; } CloseHandle(hDrv); } 

这是GPS.h

 class Adder { public: Adder(){;}; ~Adder(){;}; void CaptureGPS(); }; 

这是我的来源: http : //pastie.org/3436376

它说can't find entry point CaptureGPS in PInvoke RF PWF.dll

请有人帮我解决这个问题..

有什么问题……

我先解释一下,你写的是什么

 extern "C" //No name mangling __declspec(dllexport) #include "GPS.h" 

将在预处理后扩展到

 extern "C" //No name mangling __declspec(dllexport) class Adder { public: Adder(){;}; ~Adder(){;}; void CaptureGPS(); }; 

这意味着,你是:

  • 试图制作class Adder C style结构(虽然由于class Adder不可能不是POD,但extern "C"却被忽略了)

  • 尝试导出class Adder的变量,如果它将在class定义后定义,如:

     extern "C" //No name mangling __declspec(dllexport) class Adder { public: Adder(){;}; ~Adder(){;}; void CaptureGPS(); } variable; 

    但它没有定义任何variable ,所以__declspec(dllexport)只是被忽略了。

请注意,您在class Adder声明了一些方法但未定义它们。 没关系,你不要尝试使用class Adder 。 另请注意,您的void CaptureGPS()void Adder::CaptureGPS()没有任何关系,它只是单独的函数

我想,你应该这样做

看来,你只想导出void CaptureGPS();

如果是,您应该添加到您的头文件:

 extern "C" __declspec(dllexport) void CaptureGPS(); 

比, CaptureGPS()将被导出,你可以用pinvoke调用它

MSDN有一篇文章介绍了为P / Invoking编写DLL函数并通过dumpbin检查导出的名称。 它是专门为Compact Framework编写的,因此它与您正在做的事情非常相关。

那就是说,为什么要为此创建一个DLL呢? 为什么不直接从你的C#应用​​程序P / Invoke CreateFile,DeviceIoControl和CloseHandle? 还有另一篇MSDN文章介绍了在Compact Framework中使用托管代码的流接口驱动程序 。