[英]Can't find PInvoke DLL - BUG?
我有Windows mobile GPS第三方應用程序。這是C ++代碼,其中包含GPS自動啟用/禁用功能。
我要制作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
樣式的結構(並且由於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 / Invoke編寫DLL函數以及通過dumpbin檢查導出的名稱。 它是專門為Compact Framework編寫的,因此它與您的工作非常相關。
也就是說,為什么仍要為此創建一個DLL? 為什么不直接從C#應用程序P /調用CreateFile,DeviceIoControl和CloseHandle? MSDN上還有另一篇文章,內容涵蓋了Compact Framework中托管代碼的流接口驅動程序的使用 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.