2011-12-18 2 views
0

Я пытаюсь использовать OpenCV в here, и я застрял в один момент, когда я получаю PInvoke, а именно:DLL PInvoke с библиотеками Windows Mobile C++ портирования на C#

мой DLL.cpp

#define DLL_API __declspec(dllexport) 
//... 
DLL_API short processImage(const char* in_file, const char * out_file) 
//... 

мой form.cs

[DllImport("DLL", EntryPoint = "processImage")] 
     private static extern short _ProcessImage(byte[] in_file, byte[] out_file); 

     public static short binarizeImage(string in_file, string out_file) 
     { 
      return _ProcessImage(StringToASCIIByteArray(in_file), StringToASCIIByteArray(out_file)); 
     } 

    public static byte[] StringToASCIIByteArray(string str) 
    { 
     return Encoding.ASCII.GetBytes(str + "\0"); 
    } 

Я думаю, что это может быть проблема с целевой архитектуры (в моем проекте VS 2008). Когда я использую «Любой процессор», он компилирует &, но бросает Pinvoke, когда я устанавливаю его на «Windows Mobile 6 Professional SDK (ARMV4I)», он компилируется, но не хочет развертываться, и я получил это в окне вывода:

1>------ Deploy started: Project: DLL, Configuration: Debug Windows Mobile 6 Professional SDK (ARMV4I) ------ 
1>The system cannot find the path specified. 
1> 
2>------ Deploy started: Project: smartDeviceOcr, Configuration: Debug Any CPU ------ 
2>Deploying 'D:\VS 2008 Projects\C++\SmartDevice\ocr\smartDeviceOcr\bin\Debug\smartDeviceOcr.exe' 
========== Deploy: 1 succeeded, 1 failed, 0 skipped ========== 

Имеет ли значение конкретное значение ARMV4I? У меня есть ARM920T на моем мобильном телефоне. Могу/должен ли я редактировать это, чтобы заставить его работать?


EDIT:

Просто чтобы быть ясно точки PInvoke к:

return _ProcessImage(StringToASCIIByteArray(in_file), StringToASCIIByteArray(out_file)); 

и сообщение об исключении:

System.MissingMethodException was unhandled 
    Message="Cannot find the library DLL PInvoke 'DLL'." 
    StackTrace: 
    in smartDeviceOcr.Form1.binarizeImage(String in_file, String out_file) 
    in smartDeviceOcr.Form1.button1_Click(Object sender, EventArgs e) 
    in System.Windows.Forms.Control.OnClick(EventArgs e) 
    in System.Windows.Forms.Button.OnClick(EventArgs e) 
    in System.Windows.Forms.ButtonBase.WnProc(WM wm, Int32 wParam, Int32 lParam) 
    in System.Windows.Forms.Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam) 
    in Microsoft.AGL.Forms.EVL.EnterMainLoop(IntPtr hwnMain) 
    in System.Windows.Forms.Application.Run(Form fm) 
    in smartDeviceOcr.Program.Main() 

EDIT2:

Хорошо, теперь это действительно странно. Я многое изменил. Я добавил DLL openCV в список развертывания в свойствах проекта, чтобы я мог видеть, что они копируются при развертывании, и я скопировал вручную все DLL-файлы в exe-каталог на ПК.

Я также изменил некоторые из вариантов развертывания в проекте DLL, так что библиотеки DLL копируются в соответствующий каталог (автоматически) на телефон и ....

теперь у меня есть ошибка во время выполнения (если пытается получить доступ к функции из DLL - OpenCV):

дистанционное подключение к устройству было потеряно

+0

OpenCV - это собственный код.Вам понадобится версия, предназначенная для вашего процессора. –

+0

Эта версия была создана для мобильных процессоров Windows (я использую версию с сайта, о котором я упоминал в начале. – Patryk

+0

Маршрутизатор pinvoke, похоже, не согласен. Видение фактического сообщения об исключении поможет нам помочь вам диагностировать проблему. –

ответ

0

Как я не вижу никаких ответов я отправляю мой ответ (хотя я до сих пор проблемы с этим)

Проблема может быть решена путем добавления каталогов, к которым DLLs должен быть развернут:

Project-> Properties -> Deployment -> Remote Directory

и правильно указать файлы:

Project-> Properties -> Deployment -> Additional Files

, как как

highgui200.dll|$(SolutionDir)\opencv_winmo\dll|%CSIDL_PROGRAM_FILES%\smartDeviceOcr|0 
cv200.dll|$(SolutionDir)\opencv_winmo\dll|%CSIDL_PROGRAM_FILES%\smartDeviceOcr|0 
cxcore200.dll|$(SolutionDir)\opencv_winmo\dll|%CSIDL_PROGRAM_FILES%\smartDeviceOcr|0 
ml200.dll|$(SolutionDir)\opencv_winmo\dll|%CSIDL_PROGRAM_FILES%\smartDeviceOcr|0 
msvcr90.dll|$(BINDIR)\$(INSTRUCTIONSET)\|%CSIDL_PROGRAM_FILES%\smartDeviceOcr|0 
Смежные вопросы