2010-04-28 24 views
6

Je voudrais appeler cette méthode dans la bibliothèque non gérée:Comment marshal int * en C#?

void __stdcall GetConstraints(

    unsigned int* puiMaxWidth, 

    unsigned int* puiMaxHeight, 

    unsigned int* puiMaxBoxes 

); 

Ma solution:

  • définition de délégué:

    [UnmanagedFunctionPointer (CallingConvention.StdCall)] délégué privé GetConstraintsDel vide (PUISSANCE MAXIMALE UINTERPTR, PUISSANCE MAXIMALE UINTER, PUISSANCE INFÉRIEURE);

  • L'appel de la méthode:

    // PLUGIN NAME 
    GetConstraintsDel getConstraints = (GetConstraintsDel)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall, typeof(GetConstraintsDel)); 
    
    uint maxWidth, maxHeight, maxBoxes; 
    
    unsafe 
    { 
        UIntPtr a = new UIntPtr(&maxWidth); 
        UIntPtr b = new UIntPtr(&maxHeight); 
        UIntPtr c = new UIntPtr(&maxBoxes); 
        getConstraints(a, b, c); 
    } 
    

Il fonctionne, mais je dois laisser le drapeau "dangereux". Y a-t-il une solution sans code dangereux? Ou est-ce que cette solution est correcte? Je ne comprends pas très bien les implications de la configuration du projet avec un drapeau non sécurisé.

Merci pour votre aide!

+0

je crois qu'il devrait fonctionner comme il est (moins l'adresse des opérateurs) sans bloc dangereux ... –

+0

Il ne fonctionne pas. Le constructeur de UIntPtr prend comme paramètre l'adresse du pointeur. –

Répondre

4

Vous venez de sortir?

-à-dire:

HRESULT GetTypeDefProps (
    [in] mdTypeDef td, 
    [out] LPWSTR  szTypeDef, 
    [in] ULONG  cchTypeDef, 
    [out] ULONG  *pchTypeDef, 
    [out] DWORD  *pdwTypeDefFlags, 
    [out] mdToken  *ptkExtends 
); 

fonctionne très bien avec:

uint GetTypeDefProps 
(
    uint td, 
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=2)]char[] szTypeDef, 
    uint cchTypeDef, 
    out uint pchTypeDef, 
    out uint pdwTypeDefFlags, 
    out uint ptknds 
); 

Exemples d'utilisation;

char[] SzTypeDef; 
uint CchTypeDef; 
uint PchMember; 
IntPtr PpvSigBlob; 
uint PbSigBlob; 

    SzTypeDef= new char[500]; 
    CchTypeDef= (uint)SzTypeDef.Length; 

ResPT= 
    MetaDataImport.GetTypeDefProps 
    (
    td, 
    SzTypeDef, 
    CchTypeDef, 
    out pchTypeDef, 
    out pdwTypeDefFlags, 
    out ptkExtends 
); 
+0

Note: ceci est le code de travail réel –

+0

Merci, ça marche! –