找不到PInvoke DLL - BUG?

时间:2012-02-23 09:28:06

标签: c# c++ visual-c++ windows-mobile

我有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

请有人帮帮我..

问题是什么......

2 个答案:

答案 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