2010-04-28 25 views
6

ben yönetilmeyen kütüphanede bu yöntem çağırmak istiyorum:C# içinde marshal nasıl *?

void __stdcall GetConstraints(

    unsigned int* puiMaxWidth, 

    unsigned int* puiMaxHeight, 

    unsigned int* puiMaxBoxes 

); 

Çözümümün:

  • Delege tanımı:

    [UnmanagedFunctionPointer (CallingConvention.StdCall)] özel temsilci geçersiz GetConstraintsDel (UIntPtr puiMaxWidth, UIntPtr puiMaxHeight, UIntPtr puiMaxBoxes);

  • yöntemin çağrı:

    // 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); 
    } 
    

O inşaat ama "güvenli olmayan" bayrağını izin vermek zorunda. Güvenli olmayan kodsuz bir çözüm var mı? Yoksa bu çözüm tamam mı? Projeyi güvensiz bayrakla kurmanın etkilerini tam olarak anlamadım.

Yardımlarınız için teşekkürler!

+0

Ben (eksi adres operatör) güvensiz bloğu olmadan ... –

+0

O çalışmıyor olduğu gibi çalışması gerekir inanıyoruz. UIntPtr kurucusu işaretçi adresi parametresini alır. –

cevap

4

Sadece uint?

yani:

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

ile çalışıyor:

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

Numune kullanımı;

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

Not: Bu fiili çalışma kodu –

+0

Teşekkürler, işe yarıyor! –