Понимание SP_DEVICE_INTERFACE_DETAIL_DATA и обработки на нем [дубликат]

Режим HTML5 требует перезаписи URL.

Из Документов:

Режим HTML5

Серверная сторона

Используя это режим требует перезаписи URL-адресов на стороне сервера, в основном вы должны переписать все свои ссылки на точку входа вашего приложения (например, index.html). Требование к тегу также важно для этого случая, так как позволяет AngularJS различать часть URL-адреса, которая является базой приложения, и путь, который должен обрабатывать приложение.

- Руководство разработчика AngularJS - Использование $ location (сторона сервера HTML5)

blockquote>

Для NodeJS и ExpressJS

var express = require('express');
var path = require('path');
var router = express.Router();

// serve angular front end files from root path
router.use('/', express.static('app', { redirect: false }));

// rewrite virtual urls to angular app to enable refreshing of internal pages
router.get('*', function (req, res, next) {
    res.sendFile(path.resolve('app/index.html'));
});

module.exports = router;

Для IIS в Windows


  
    
      
      
        
        
      
      
    
  

См., Как настроить IIS для URL-адреса Переписывание приложения AngularJS в режиме HTML5?

Для apache

RewriteEngine On RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR] 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]
RewriteRule ^

] См. Как переписать url в apache htaccess для приложения angularjs

Для получения дополнительной информации

Статья: AngularJS - Включить страницу режима HTML5 Обновить без 404 Ошибки в NodeJS и IIS .

1
задан Daniele Mereu 22 June 2015 в 13:53
поделиться

1 ответ

Структура представляет собой структуру с переменным размером, которая не может автоматически сортироваться. Вам нужно будет сделать это самостоятельно.

Вам нужно удалить тип SP_DEVICE_INTERFACE_DETAIL_DATA. Это бесполезно для вас. Измените объявление SetupDiGetDeviceInterfaceDetail на:

[DllImport(@"setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern Boolean SetupDiGetDeviceInterfaceDetail(
    IntPtr hDevInfo, 
    SP_DEVICE_INTERFACE_DATA deviceInterfaceData, 
    IntPtr deviceInterfaceDetailData, 
    uint deviceInterfaceDetailDataSize, 
    out uint requiredSize, 
    SP_DEVINFO_DATA deviceInfoData
);

Пропустите IntPtr.Zero при первом вызове SetupDiGetDeviceInterfaceDetail. Затем выделите буфер требуемого размера, вызвав Marshal.AllocHGlobal. Затем напишите размер в первые 4 байта этого буфера. Затем снова вызовите SetupDiGetDeviceInterfaceDetail.

Что-то в этих строках:

bool result3 = Win32.SetupDiGetDeviceInterfaceDetail(hDevInfo, ifData, IntPtr.Zero, 0, 
    out needed, null);
if(!result3)
{
    int error = Marshal.GetLastWin32Error();
}
// expect that result3 is false and that error is ERROR_INSUFFICIENT_BUFFER = 122, 
// and needed is the required size

IntPtr DeviceInterfaceDetailData = Marshal.AllocHGlobal((int)needed);
try
{
    uint size = needed;
    Marshal.WriteInt32(DeviceInterfaceDetailData, (int)size);
    bool result4 = Win32.SetupDiGetDeviceInterfaceDetail(hDevInfo, ifData, 
        DeviceInterfaceDetailData, size, out needed, null);
    if(!result4)
    {
        int error = Marshal.GetLastWin32Error();
    }
    // do whatever you need with DeviceInterfaceDetailData
}
finally
{
    Marshal.FreeHGlobal(DeviceInterfaceDetailData);
}
2
ответ дан David Heffernan 22 August 2018 в 14:09
поделиться
  • 1
    Большое спасибо Дэвиду за вашу помощь и терпение! – Daniele Mereu 22 June 2015 в 13:55
  • 2
    Вы не хотите писать возвращаемый размер. В MSDN: член cbSize всегда содержит размер фиксированной части структуры данных, а не размер, отражающий строку переменной длины в конце. Эта строка должна писать (IntPtr.Size == 8? 8: 4 + Marshal.SystemDefaultCharSize) – Jeff 10 June 2016 в 01:58
  • 3
    Этот последний бит был действительно важен! – KansaiRobot 16 February 2018 в 01:38
Другие вопросы по тегам:

Похожие вопросы: