找不到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中使用托管代码的流接口驱动程序 。