可以';找不到PInvoke DLL-BUG

本文关键字:PInvoke DLL-BUG 找不到 可以 | 更新日期: 2023-09-27 18:25:28

我有Windows移动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

请任何人帮我解决这个问题。。

问题是什么。。。

可以';找不到PInvoke DLL-BUG

让我首先解释一下您写了什么

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/Invoking编写DLL函数以及通过dumpbin检查导出的名称。它是专门为Compact Framework编写的,因此它与您正在做的事情非常相关。

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