функция pinvoking не выполняется - PullRequest
0 голосов
/ 24 января 2011

Я пытаюсь вызвать эту функцию в .net compact framework из неуправляемой dll, которую дал мне manufacter устройства:

Bool GetModelInfo(LPTSTR pszInfo, DWORD dwInfoType);

infoType является одним из следующих перечислений:

enum ModemInfoType{
    Model_name,
    Model_revision,
    Model_IMEI,
    Model_IMSI
};

Мой фактический вызов pinvoke следующий:

[System.Runtime.InteropServices.DllImportAttribute(gsmaAdapterDLLName, EntryPoint = "#36", CallingConvention = CallingConvention.Winapi)]   
[return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
    internal static extern bool GetModelInfo([System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPStr)] out string pszInfo, uint dwInfoType);

Я знаю, что они должны были собрать строку, просто не знаю, должен ли я передавать stringBuilder вместо строки. Проблема в том, что я получаю NotSupportedException при попытке выполнить вызов функции.

    /// <summary>
    /// Gets the modem info.
    /// </summary>
    /// <param name="modemInfo">The modem info.</param>
    /// <param name="infoRequested">The info requested.</param>
    /// <returns></returns>
    public bool GetModemInfo(out string modemInfo, NativeHelper.ModemInfoType infoRequested)
    {
        String _mymodemInfo;
        if (NativeImports.GetModelInfo(out _mymodemInfo, (uint)infoRequested) == true)
        {
            modemInfo = _mymodemInfo;
            return true;
        }
        else
        {
            modemInfo = "";
            return false;
        }
    }

Это моя функция-обертка, которая вызывает собственный метод

1 Ответ

0 голосов
/ 24 января 2011

Вызов по порядковому номеру хрупок, поэтому я сомневаюсь, что вызов в первую очередь, но, учитывая это, я бы попробовал это:

[DllImport(gsmaAdapterDLLName, EntryPoint = "#36")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool GetModelInfo(StringBuilder pszInfo, ModemInfoType dwInfoType);

private string GetModelName()
{
    StringBuilder sb = new StringBuilder(1024);
    if (!GetModelInfo(sb, ModemInfoType.Name))
    {
        throw new Exception("Call failed");
    }
    return sb.ToString();
}
...