Hallo Jungs,
ich werd die Frage so allgemein wie möglich halten, damit die Community auch was davon hat.
Vorab: Ich nutze in meinem C++/CLI Programm recht häufig die Win32 API, Dank IJW ist das auch sehr einfach und unglaublich performant. Den gap zwischen Native C++ und Managed C++(CLI) schließe ich mit einer einzigen Wrapper-Klasse, die für alle nötigen API-Calls eine statische Methode bereitstellt. Soweit funktioniert das bisher bestens.
Frage: Kann ich davon ausgehen, dass von einer Win32-Api-Funktion zurüchgegebene Handles, die ich nach IntPrt gecastet habe, in der Managed-Umgebung gültig sind? Ich habe bewusst auf pin_ptr verzichtet und will auch keine Vorschläge hören, die darauf abzielen, unmanaged mem zu verwenden, zu locken, was auch immer.
Etwas Code hab ich auch, funktioniert auch prima, aber ich würde gern etwas Sicherheit bei der Pointerübergabe von Native zu CLI haben,
Verwendung in meinem mainframe
Teile der Marshalling-Klasse
ich werd die Frage so allgemein wie möglich halten, damit die Community auch was davon hat.
Vorab: Ich nutze in meinem C++/CLI Programm recht häufig die Win32 API, Dank IJW ist das auch sehr einfach und unglaublich performant. Den gap zwischen Native C++ und Managed C++(CLI) schließe ich mit einer einzigen Wrapper-Klasse, die für alle nötigen API-Calls eine statische Methode bereitstellt. Soweit funktioniert das bisher bestens.
Frage: Kann ich davon ausgehen, dass von einer Win32-Api-Funktion zurüchgegebene Handles, die ich nach IntPrt gecastet habe, in der Managed-Umgebung gültig sind? Ich habe bewusst auf pin_ptr verzichtet und will auch keine Vorschläge hören, die darauf abzielen, unmanaged mem zu verwenden, zu locken, was auch immer.
Etwas Code hab ich auch, funktioniert auch prima, aber ich würde gern etwas Sicherheit bei der Pointerübergabe von Native zu CLI haben,
Verwendung in meinem mainframe
Code:
IntPtr hIconSmall, hIconLarge;
Win32::GetIconHandlesFromFile(node->Name, hIconSmall, hIconLarge);
Teile der Marshalling-Klasse
Code:
bool Win32::GetIconHandlesFromFile(String^ path, [Out] IntPtr %smallIconHandle, [Out] IntPtr %largeIconHandle)
{
// on error return false
SHFILEINFO shfi = {0};
IntPtr pPath = Marshal::StringToHGlobalUni(path);
LPCWSTR pszPath = static_cast<wchar_t*>(pPath.ToPointer());
UINT uFlagsSmall = (UINT) (SHGFI_ICON | SHGFI_SMALLICON);
UINT uFlagsLarge = (UINT) (SHGFI_ICON | SHGFI_LARGEICON);
DWORD_PTR hImgListSmall = SHGetFileInfo(
pszPath,
0,
&shfi,
(UINT) sizeof(SHFILEINFO),
uFlagsSmall);
smallIconHandle = cli::safe_cast<IntPtr>(shfi.hIcon);
DWORD_PTR hImgListLarge = SHGetFileInfo(
pszPath,
0,
&shfi,
(UINT) sizeof(SHFILEINFO),
uFlagsLarge);
largeIconHandle = cli::safe_cast<IntPtr>(shfi.hIcon);
return true;
}