2014-09-08 6 views
0

Я пытаюсь передать 2D-маску (все 0s, ожидают, что интересующая область как 1s) от C# (как короткая []) до C++ (как unsigned short *), но я не могу получить правильное значение в C++.Передача указателя с C# на C++

C#

[DllImport("StatsManager.dll", EntryPoint = "SetStatsMask")] 
private static extern int SetStatsMask(IntPtr mask, int imgWidth, int imgHeight); 

short[] mask; 
mask = new short[8*8]; 
// some operation here making a ROI in mask all 1. ex 0000111100000000 in 1D 
IntPtr maskPtr = Marshal.AllocHGlobal(2 * mask.Length); 
Marshal.Copy(mask, 0, maskPtr, mask.Length); 
SetStatsMask(maskPtr, width, height); 

C++

long StatsManager::SetStatsMask(unsigned short *mask, long width, long height) 
{ 
    //create memory to store the incoming mask 
    //memcpy the mask to the new buffer 
    //pMask = realloc(pMask,width*height*sizeof(unsigned short)); 

    long ret = TRUE; 

    if (NULL == _pMask) 
    { 
     _pMask = new unsigned short[width * height]; 
    } 
    else 
    { 
     realloc(_pMask,width*height*sizeof(unsigned short)); 
    } 

    memcpy(mask,_pMask,width*height*sizeof(unsigned short)); 

    SaveBuffer(_pMask, width, height); 

    return ret; 
} 

Но все, что я могу видеть, для маски в C++ с помощью окна часов является 52536 вместо 0000111100000000, поэтому мне интересно, где я испортил? Кто-нибудь может помочь? Благодарю.

+0

Вы бы лучше объявить параметр 'mask' в C#, чтобы принять' ushort [] '- массив будет автоматически переводиться в' unsigned short * '. – cdhowie

+0

Вы имеете в виду, что маску следует объявить как ushort []? – Ono

+0

И массив, который вы используете, и параметр 'IntPtr' должны быть изменены на' ushort [] ', а затем просто передайте свой массив C#. Уровень P/Invoke будет перенаправлять его в массив C-style для вас. Вам не нужно использовать какие-либо методы «Маршал», которые вы используете. – cdhowie

ответ

2

Я считаю, что вы неуместны параметры memcpy:

memcpy(mask,_pMask,width*height*sizeof(unsigned short)); 

Как я понимаю, вы хотите скопировать из mask в _pMask, так что вы должны написать:

memcpy(_pMask, mask, width*height*sizeof(unsigned short)); 
+0

Ха, как я могу пропустить это! Спасибо, ты потрясающий! – Ono

Смежные вопросы