C#-ból DLL függvény átnevezési probléma. HELP
2010-09-25T12:26:26+02:00
2010-09-28T11:19:37+02:00
2022-07-19T17:16:24+02:00
betman
Sziasztok!

A következő agyament gondom van és már kezdek beledilizni.
Adott egy c++ ban megírt DLL melynek van 2db meghívandó függvénye mindkettő egy struktúrát ad vissza (azaz egy pointert ugye) Amikor meghívom az első függvényt a C# programomból, akkor semmi gond, visszaadja amit kell. A második szintén. Azonban....
Ha a dll-ben átírom a függvényem nevét (a c# programban szintén átírom természetesen) akkor a második függvényhívásnál "Attempted to read or write protected memory. This is often an indication that other memory is corrupt." hibával. Ha az elsőt kiszedem akkor a második névváltoztatással is lefut, csak egymás után nem a kettő, ha a második nevét megváltoztatom. Próbáltam már rebuildelni mindent, áthelyezni, előző verziót átírni stb mindig ugyenez jön ki.

a c# meghívása a két függvénynek:

getcudadevices cudadevices_struct = new getcudadevices(); IntPtr ptr = DLLgetDevice(1); cudadevices_struct = (getcudadevices)(Marshal.PtrToStructure(ptr, typeof(getcudadevices))); csinal_amit kell(); chkcuda cudachk_struct = new chkcuda(); IntPtr ptrt = DLLchkCuda(1); cudachk_struct = (chkcuda)(Marshal.PtrToStructure(ptrt, typeof(chkcuda)));

getcudadevices és chkcuda egy struktúra ami tükrözi a dll-ben található struktúrát.

a c++ dll függvénydeklarációja:


struct chkcuda { int device_count; int cuda_device_count; }; chkcuda DLLDIR *DLLchkCuda(int);

Korábban volt hasonló problémám c++ ban meghívva a DLL-t de akkor egy korábbi verzióra váltás megoldotta a problémát.
Mutasd a teljes hozzászólást!
A hiba mégsem a c# részben volt, hanem a c++ dllben, hogy egy char[256] átmásolását char*-ba strnpy helyett strcpy-val intéztem, ami nem kezelte le a char[256] tömb végét.
Most jó minden :)
Mutasd a teljes hozzászólást!

  • A jelek szerint ott a bibi hogy az első függvény által átadott struktúra a c++ programban char*-ot tartalmaz amit a másik oldalon IntPtr nek definiálok majd ezt alakítom string-é.
    Úgy tűnik ez szépen átadja a kívánt karaktersort csak épp később okoz gondokat valahogyan.

    a strukt egy példánya az átadott getstruct struktúrának:

    public struct getstruct
    {
    public IntPtr szoveg;
    };

    string dev = Marshal.PtrToStringAnsi(struct.szoveg);

    Valaki meg tudná mondani hogyan adjam át ha nem így?
    Mutasd a teljes hozzászólást!
  • A hiba mégsem a c# részben volt, hanem a c++ dllben, hogy egy char[256] átmásolását char*-ba strnpy helyett strcpy-val intéztem, ami nem kezelte le a char[256] tömb végét.
    Most jó minden :)
    Mutasd a teljes hozzászólást!
abcd