Не удается найти PInvoke DLL - BUG? - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть стороннее приложение GPS для мобильных устройств Windows. Это код 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

Пожалуйста, кто-нибудь, помогите мне с этим ..

В чем проблемы ...

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Позвольте мне сначала объяснить, что вы написали

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 голос
/ 23 февраля 2012

В MSDN есть статья, в которой описывается написание функции DLL для P / Invoking и проверка экспортированных имен через мусорную корзину. Он был написан специально для Compact Framework, поэтому очень важен для того, что вы делаете.

Тем не менее, почему вы все равно создаете DLL для этого? Почему бы просто не использовать P / Invoke CreateFile, DeviceIoControl и CloseHandle прямо из вашего приложения на C #? Есть еще одна статья MSDN, в которой рассказывается об использовании драйверов потокового интерфейса из управляемого кода в Compact Framework.

...