Articles of marshalling

Comment organiser un pointeur sur un tableau de pointeurs vers des structures?

J’ai une fonction C avec la signature suivante: int my_function(int n, struct player **players) players est un pointeur sur un tableau de pointeurs permettant de struct player objects struct player . n est le nombre de pointeurs dans le tableau. La fonction ne modifie ni le tableau ni le contenu des structures et ne conserve […]

C # Marshalling double * à partir de DLL C ++?

J’ai une DLL C ++ avec une fonction exscope: extern “C” __declspec(dllexport) double* fft(double* dataReal, double* dataImag) { […] } La fonction calcule la FFT des deux tableaux doubles (réel et imaginaire) et renvoie un seul tableau double avec le réel et les composants imaginaires entrelacés: {Re, Im, Re, Im, …} Je ne sais pas […]

si GetFields () ne garantit pas l’ordre, comment LayoutKind.Sequential fonctionne

Je dois obtenir fieldinfo dans un ordre garanti en ce qui concerne l’ordre de déclaration. En ce moment, j’utilise des atsortingbuts pour spécifier l’ordre. Y a-t-il un moyen plus automatique de faire cela? Est-ce que quelqu’un sait comment fonctionne LayoutKind.Sequential et si je peux appliquer sa technique? Je ne vois pas comment LayoutKind.Sequential fonctionne, à […]

Marshalling tableau de chaînes à char ** en C #

J’appelle une fonction DLL C et je dois fournir la structure C suivante: typedef struct { char *mTableId; char **mFieldNames; int mNumFields; char *mFilter; char *mSort; int mOffset; int mMaxRecords; char *mTargetRecordFilter; int mSurroundingRecordsCount; int *mOwnerIds; int mNumOwnerIds; gsi_bool mCacheFlag; } SAKESearchForRecordsInput; Le problème est avec char ** mFieldNames; J’ai essayé de marshalling automatiquement comme […]

Erreur Marshal.PtrToStructure à l’origine de System.ArgumentException

J’essaie d’obtenir un KBDLLHOOKSTRUCT à partir du lParam d’un crochet de clavier. private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { KBDLLHOOKSTRUCT kbd = new KBDLLHOOKSTRUCT(); Marshal.PtrToStructure(lParam, kbd); // Throws System.ArguementException … Malheureusement, le PtrToStructure jette deux A first chance exception of type ‘System.ArgumentException’ occurred in myprogram.exe des erreurs chaque fois qu’une touche est […]

C #: rassemblement d’une structure contenant des tableaux

Je fais du travail d’interopérabilité C #. J’ai la structure suivante: #pragma pack(push,1) typedef struct { unsigned __int64 Handle; LinkType_t Type; LinkState_t State; unsigned __int64 Settings; signed __int8 Name[MAX_LINK_NAME]; unsigned __int8 DeviceInfo[MAX_LINK_DEVINFO]; unsigned __int8 Reserved[40]; } LinkInfo_t; Voici ma tentative de le convertir en une structure C #: [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct LinkInfo_t […]

Marshaling d’un tableau d’octets dans une structure C #

Je travaille sur un projet C # pour lire le secteur de démarrage FAT32 et le BPB. Le problème est que j’utilise un mécanisme de marshaling pour convertir un tableau d’octets en une structure de données Custom FAT32. Je reçois un message d’erreur indiquant: Impossible de charger le type ‘FAT32Management.Fat32BootSector’ de l’assembly ‘FAT32Management, version = […]

Marshal.FreeHGlobal doit-il être placé dans un bloc final pour garantir la suppression des ressources?

J’ai le bloc de code suivant: IntPtr unmanagedPointer = Marshal.AllocHGlobal(buffer.Length); Marshal.Copy(buffer, 0, unmanagedPointer, buffer.Length); SomeCommandThatCanThrowAnException(); Marshal.FreeHGlobal(unmanagedPointer); Si le bloc est encapsulé dans une tentative, et que la commande FreeHGlobal soit placée dans un bloc finally. (Si la commande du milieu lève une exception). Il semble logique que cela empêche finalement les memory leaks dans ce […]

Comment obtenir le caractère ** en utilisant C #?

Je dois passer un argument à une fonction non sécurisée DllImported sous la forme de: [DllImport(“third_party.dll”)] private static extern unsafe int start(int argc, char** argv); Je suppose que c’est un tableau de chaînes. Cependant, lorsque j’essaie de procéder comme suit, j’obtiens l’erreur «Impossible de convertir de chaîne [] en caractère **». Comment faire pour que […]

Conversion en .net: Native Utf-8 Chaîne gérée

J’ai créé ces deux méthodes pour convertir les chaînes natives utf-8 (char *) en chaînes gérées et inversement. Le code suivant fait le travail: public IntPtr NativeUtf8FromSsortingng(ssortingng managedSsortingng) { byte[] buffer = Encoding.UTF8.GetBytes(managedSsortingng); // not null terminated Array.Resize(ref buffer, buffer.Length + 1); buffer[buffer.Length – 1] = 0; // terminating 0 IntPtr nativeUtf8 = Marshal.AllocHGlobal(buffer.Length); Marshal.Copy(buffer, […]