我有Windows移动GPS第三方应用程序。这是代码包含GPS自动启用/禁用功能的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
请有人帮帮我..
问题是什么......
答案 0 :(得分:2)
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
- 样式结构(虽然由于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
答案 1 :(得分:1)
MSDN has an article that covers writing DLL function for P/Invoking并通过dumpbin检查导出的名称。它是专门为Compact Framework编写的,因此它与您正在做的事情非常相关。
那就是说,为什么要为此创建一个DLL呢?为什么不直接从你的C#应用程序P / Invoke CreateFile,DeviceIoControl和CloseHandle? Compact Framework中还有另一个MSDN article that covers using Stream Interface Drivers from managed code。