2010-08-18 3 views
0

Я пытаюсь получить доступ к функциям в неуправляемой DLL-C++, и я изо всех сил пытаюсь получить какие-либо результаты. Вот что я далеко:Использование C++ неуправляемой dll в C#

static unsafe void Main(string[] args) 
    { 
     IntPtr testIntPtr = aaeonAPIOpen(0); 

     var DevID = aaeonWdtGetDevID(testIntPtr); 

     Console.WriteLine("DevID: " + DevID.ToString()); //Does not work 

     byte pbData1 = 0; 
     byte pbData2 = 0; 

     Console.WriteLine("Before: {0} {1}", pbData1.ToString(), pbData2.ToString()); 

     aaeon12VData(testIntPtr, &pbData1, &pbData2); //Notice long delay, but doesn't change pbData1 or pbData2 

     Console.WriteLine("After: {0} {1}", pbData1.ToString(), pbData2.ToString()); 
    } 


    [DllImport("aonAPI.dll", EntryPoint = "[email protected]@[email protected]", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] 
    public static extern ushort aaeonWdtGetDevID(IntPtr hInst); 
    //C++ Code 
    //DLLAPI WORD aaeonWdtGetDevID(HANDLE hInst); 

    [DllImport("aonAPI.dll", EntryPoint = "[email protected]@[email protected]", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] 
    public static extern unsafe IntPtr aaeon12VData(IntPtr hInst, byte* pbData, byte* pbData2); 
    // C++ code 
    //DLLAPI HRESULT aaeon12VData(HANDLE hInst, BYTE* pbData, BYTE* pbData2); 

    [DllImport("aonAPI.dll", EntryPoint = "[email protected]@[email protected]", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] 
    public static extern IntPtr aaeonAPIOpen(uint reserved); 
    // C++ code 
    //DLLAPI HANDLE aaeonAPIOpen(DWORD reserved); 

А вот как программа C++ использует API для 12V:

while(hInst == NULL) 
{ 
    hInst = aaeonAPIOpen(0); 
} 

unsigned char temp; 
unsigned char temp2; 

if(aaeon12VData(hInst,&temp,&temp2) == S_OK) 
{ 
    m_message.Format(_T("%d.%d"),temp2,temp); 
} 

Вот в DUMPBIN:

 3 2 00001380 [email protected]@[email protected] 
     5 4 00001020 [email protected]@[email protected] 
    10 9 00001040 [email protected]@[email protected] 
+0

валюта на SO вверх-голосов. Вы вдохновляете участников помочь вам, используя их. Они не облагаются налогом. –

ответ

1

Я думаю, что если вы сделаете следующее изменение называть "ByRef", вы будете решать проблему:

public static extern unsafe IntPtr aaeon12VData(IntPtr hInst, ref byte pbData, byte pbData2); 

и:

aaeon12VData(testIntPtr, ref pbData1, ref pbData2); 
+0

Если вы "byref", то имеете в виду "ref". Это не работает. – Robert

+0

Оказывается, у меня была устаревшая dll, поэтому я не мог подключиться. Ваш комментарий был полезен после того, как я прошел мимо этого момента. – Robert

1

Ваш C# код похоже, ссылается на искаженные имена для точек входа. Это кажется мне очень подозрительным - скорее всего, неправильным. Попробуйте это без исковерканных имен (используйте предварительно закодированные имена).

+0

Я думаю, вы на нем. Также обратите внимание на соглашение о вызове cdecl, которое никогда не будет работать с искаженными именами. Я полагаю, это должно было быть «fastcall» или «thiscall». Если он изменяет его на непонятные имена, cdecl должен работать. О, и «собственный код» - лучшее описание, чем «неуправляемый» код, imho. :-) – JustBoo

+0

Я получаю ошибки в точке входа без указания исковеренных имен. – Robert

+0

Хорошо, еще две вещи. Попробуйте удалить «extern» в ваших декларациях вперед на C#. Кроме того, вы уверены, что IntPtr является надлежащим представлением hInst? Если hInst - это дескриптор (например, для объекта ядра), то IntPtr, вероятно, не то, что вы ищете. –

Смежные вопросы