C# konwersja zmiennych w funkcji z c++

0

Cześć,

ładuję dll z c++ i chcę ją użyć w c# tylko za nic nie wiem jak poradzić sobie ze zmiennymi bo to są wskaźniki. Tak to wygląda u mnie:

[DllImport("scan.dll", EntryPoint = "GetData")]
public static extern uint GetData(ref char buffer, ref uint uiLength, ref uint uiType);

a tak wygląda funkcja w dokumentacji:

{
UINT GetData
LPBYTE buffer,
UINT * uiLength,
UINT * uiType
}

będę wdzięczny za pomoc, walczę już z tym pół nocy.

2
  1. Chodziło ci chyba o
uint GetData
  LPBYTE buffer,
  UINT * uiLength,
  UINT * uiType)

Referencje właściwie powinny działać (za to ręczne ustawianie EntryPoint jest niepotrzebne)... Czemu właściwie uważasz że to nie działa (co się dzieje)?

edit albo nie, nie powinny działać. Chyba faktycznie za dużo siedzisz przed komputerem ;) ref char buffer - to NIE JEST wskaźnik do łańcucha znaków tylko do... znaku. Użyj typu string (a jeśli nie zadziała - ale powinno, ref string)

1

w C# char i byte to zupełnie różne typy (pierwszy ma DWA bajty!). Powiedz skąd się bierze to buffer: alokowane jest przez wywołujący program czy przez dllkę? Bo LPBYTE w C# to po prostu byte*, ale jak to obsłużyć to zależy od tego, po której stronie jest pamięć alokowana i zwalniana.

0

Dzięki za odpowiedź :) tak chodziło o:

UINT GetData
{
LPBYTE buffer,
UINT * uiLength,
UINT * uiType
}

dodatkowo mam takie informacje:

Parameters
buffer
[out] buffer for string scanned data.
uiLength
[in/out] buffer size
uiType
[out] barcode type

Return Values
Return 1 if the operation is successful, otherwise return 0.

Remarks
If the buffer size is less than scan data, function return 0 and the parameter uiLength return the size of the buffer to get barcode data.

Na stringu nie działa:

string buffer = "empty";
uint uiLength = 0;
uint uiType = 0;
uint res = 3;
						
res = API_GetBarData(ref buffer, ref uiLength, ref uiType);
MessageBox.Show(res.ToString());

Czy zrobię z ref czy bez to cały czas w zmiennej jest "empty". Zmienna uiLength przyjmuje wartość 22 - czyli coś się dzieje, natomiast uiType pozostaje 0, a sama funkcja zwraca wartość 0 czyli błąd.

W C++ napisałem to tak i śmigało idealnie:

UINT uiSize, uiType, i, j;
char* pBuf;
CString fileData;

uiSize = j = 0;	
getData = false;
uiSize = GetDataLength(); // pobranie ilosci zeskanowanych znakow

if(uiSize > 0) {	
	memset(pBuf, 0, 100);
	memset(fileData, 0, 100);
	GetData((LPBYTE)pBuf, &uiSize, &uiType);	// pobranie danych z czytnika			
					
	for(i = 0; i < uiSize; i++) {
		if(getData == TRUE) {
			if(isdigit(pBuf[i])) {
				fileData[j] = pBuf[i]; // usuwanie zbednych znakow
				j++;
			}
		}

		if(pBuf[i] == ')') {
			getData = true;
		}
	}
}

Może Tobie uda się dostrzec coś co ja przeoczyłem z góry dzięki za pomoc.

0

Alokowana jest przez mój program, wszystko opisałem wyżej. Zainteresowałem się tym co napisałeś, ale chyba nie bardzo mi wyszło ;d

byte[] buffer = new byte[50];
uint uiLength = 0;
uint uiType = 0;
uint res = 3;
						
res = GetData(buffer, ref uiLength, ref uiType);
MessageBox.Show(BitConverter.ToString(buffer));

Zwraca mi taki ciąg znaków

00-00-00-00-00-00-00...

0

Ok udało się, tylko trzeba zrobić porządki w zmiennych, dla potomnych:

IntPtr dataBytes = Marshal.AllocHGlobal(128);
byte[] dataDump = new byte[128];  
uint uiLength = 0;
uint uiType = 0;
uint res = 3;
						
res = GetData(dataBytes, ref uiLength, ref uiType);
						
for (int pos=0; pos < 128 ; pos++) 
{   
dataDump[pos] = Marshal.ReadByte(dataBytes, pos);  						  
}  
						  
Marshal.FreeHGlobal(dataBytes);    

	
MessageBox.Show(System.Text.Encoding.ASCII.GetString(dataDump, 0, 128));

Tylko funkcja dalej zwraca 0.

1 użytkowników online, w tym zalogowanych: 0, gości: 1