09. august 2005 - 13:51Der er
9 kommentarer og 1 løsning
DllImport - hvordan instantierer jeg nye instances af en C++ dll?
Jeg bruger en dll (C++) til at styre noget eksternt hardware. Det er nemt i C# at erklære unmanaged metoder: [DllImport("CVAPIV01.dll")] private static extern int OpenComm(StringBuilder Com); Mit problem er at de objekter jeg instantierer med en reference til dll'en tilsyneladende alle har fat i det samme dll-objekt. Eks: Hardw1.OpenComm("COM1"); Hardw2.OpenComm("COM2"); --> Hardw1 vil nu ikke længere have forbindelse til COM1, men COM2. Hvordan tvinger jeg .Net til at loade flere objekter fra den samme dll? Jeg har set et eksempel i C++ hvor man bruger HINSTANCE hard1 = LoadLibrary("mindll.dll"); HINSTANCE hard2 = LoadLibrary("mindll.dll"); Hvilket virker, men hvordan gør man det i C#?
Hvis din DLL indeholder en klasse så kan du instantiere flere objekter (instanser af den klasse) udfra en DLL.
Hvis den DLL indeholder C funktioner (eller en klasse med ene static fields & methods), så har du et problem. Fordi så er der kun en instans af al "state".
Løsningen må så være at gå et niveau ned i API - hvor du formentlig kan få en HANDLE som du kan bruge til at adskilel tingene med.
Har du et eksempel eller et link der beskriver hvordan jeg kan få en HANDLE? Jeg ved at det kan lade sig gøre fra C++ HINSTANCE h=LoadLibrary("mindll.dll"); Så det kan ikke være ene static fields & methods.
Du får lige hele mit eksempel i C++ fra producenten af hardwaret: HINSTANCE m_hdll1; // add by lxp HINSTANCE m_hdll2; // add by lxp //HINSTANCE m_hdll[2]; //..array mothed
CString StrVal; if (!nStatus) { StrVal.Format("Initila Value Block %02X (OK)",m_Value); AddContent(StrVal,0,1); } else { CVMessage(nStatus,"Initial Value Block -",StrVal); AddContent(StrVal,0,1); } }
void CDemoDlg::OnReadValue() { int nStatus = 0; char *szPage = new char[m_StarkBlock.GetLength()]; CStringToChar(m_StarkBlock,szPage); BYTE *nPage = new BYTE[1]; memcpy(nPage,StringToHexs(szPage,nStatus),sizeof(BYTE));
int nValue = 0; CV_MF_ReadValue MF_ReadValue; MF_ReadValue = (CV_MF_ReadValue)GetProcAddress(m_hdll2,"MF_ReadValue");
nStatus = MF_ReadValue(m_Address,*nPage,&nValue); CString StrVal; if (!nStatus) { m_Value = nValue; StrVal.Format("MIFARE Value Block Read(OK-) Value %02X ",m_Value); AddContent(StrVal,0,1); } else { CVMessage(nStatus,"MIFARE Value Block Read -",StrVal); AddContent(StrVal,0,1); } } ------------------------------------------------------ Det er ikke pænt, men de påstår det virker. Hvis det er rigtigt må m_hdll1 og m_hdll2 have fat på to forskellige objekter…eller?
okay... hvordan går jeg så "et niveau ned"? Kan jeg bruge HANDLE's til at skille det?
NB: Det lyder nu mærkeligt at de har lavet et eksempel til mig hvor de opretter et array med instances?! Jeg har forklaret dem mit problem med flere enheder tilsluttet og fået ovenstående som svar.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.