Маршрутизатор P / Invoke предположит, что память для типа возврата была выделена CoTaskMemAlloc () и вызовет CoTaskMemFree (), чтобы освободить его. Если это не было сделано, программа потерпит неудачу с исключением в Vista и Win7, но без проблем протекает память на XP. Использование SysAllocString () может быть выполнено для работы, но вы должны аннотировать тип возвращаемого значения в атрибуте [DllImport]. Не делать этого все равно вызовет утечку, без диагностики на Win7. BSTR является not указателем на блок памяти, выделенный CoTaskMemAlloc, перед указанным адресом есть 4 байта, которые хранят размер строки.
Любой из следующих комбинации будут работать правильно:
extern «C» __declspec (dllexport) BSTR __stdcall ReturnsAString () {return SysAllocString (L «Hello world»); } [DllImport (@ "c: \ projects \ cpptemp1 \ debug \ cpptemp1.dll")] [return: MarshalAs (UnmanagedType.BStr)] // ПРИМЕЧАНИЕ: требуется! частная статическая внешняя строка ReturnsAString ();
Или:
extern «C» __declspec (dllexport) const wchar_t * __stdcall ReturnsAString () {const wchar_t * str = L «Hello world»; wchar_t * retval = (wchar_t *) CoTaskMemAlloc ((wcslen (str) +1) * sizeof (wchar_t)); wcscpy (retval, str); return retval; } [DllImport (@ "c: \ projects \ cpptemp1 \ debug \ cpptemp1.dll", CharSet = CharSet.Auto)] частная статическая внешняя строка ReturnsAString ();
Вы должны подумать о том, чтобы позволить клиентскому коду передать буфер, чтобы не было проблем с управлением памятью. Это должно выглядеть так:
extern «C» __declspec (dllexport) void __stdcall ReturnsAString (wchar_t * buffer, size_t buflen) {wcscpy_s (буфер, buflen, L "Hello world") ; } [DllImport (@ "c: \ projects \ cpptemp1 \ debug \ cpptemp1.dll", CharSet = CharSet.Auto)] private static extern void ReturnsAString (буфер StringBuilder, int buflen); ... StringBuilder sb = new StringBuilder (256); ReturnsAString (sb, sb.Capacity); string s = sb.ToString ();
Прямо от W3C для HTML4:
Ссылки и привязки, определенные элементом A, не должны быть вложенными ; элемент A не должен содержать никаких других элементов A.
Поскольку DTD определяет элемент LINK как пустой, элементы LINK могут также не вставляться.
И для HTML5 это немного отличается .
Вы не можете иметь интерактивный контент внутри элемента A. Интерактивное содержимое содержит теги привязки.
Вложенные ссылки являются незаконными. Чтобы добиться такого же поведения, как и в вложенных ссылках, вы можете сделать следующее:
Использовать HTML-формат @mikevoermans, как показано ниже, и связать событие click
<div class="sp_mngt_bar">
<h1><a href="#"<?php echo $v; ?></a></h1>
<a href="#" class="t_icons t_icons_settings sp_mngt_settings"></a>
<a href="#" class="t_icons t_icons_move sp_mngt_move"></a>
</div>
Ваше событие click должно выглядеть так: это:
$(".sp_mngt_bar").bind("click", function(e) {
var target = $(e.target);
if(target.has('.t_icons_settings') { //Do something for settings }
else if(target.has('.t_icons_move') { //Do something for move }
else { //Do something for sp_mngt_bar
});
Вот чистое решение html / css:
HTML
<div class="block">
<a class="overlay" href="#overlay-link"></a>
<div class="inner">
This entire box is a hyperlink. (Kind of)<br><br><br><br>
<a href="#inner-link">I'm a W3C compliant hyperlink inside that box</a>
</div>
</div>
CSS
.block {
position:relative;
}
.block .overlay {
position:absolute;
left:0; top:0; bottom:0; right:0;
}
.block .inner {
position:relative;
pointer-events: none;
z-index: 1;
}
.block .inner a {
pointer-events: all;
}
Я бы переделал его так, чтобы он был больше похож на этот формат:
<div class="sp_mngt_bar">
<h1><a href="#"<?php echo $v; ?></a></h1>
<a href="#" class="t_icons t_icons_settings sp_mngt_settings"></a>
<a href="#" class="t_icons t_icons_move sp_mngt_move"></a>
</a>
a
должно быть некоторое содержимое. Хотя формально правильный, пустой a
элемент плохо подходит для доступности. (Я полагаю, идея состоит в том, что у них есть настройки CSS, включая фоновое изображение, но это плохо для доступности).
– Jukka K. Korpela
27 March 2012 в 05:52
Хотя я полностью согласен с выбранным ответом и да, вы не должны иметь интерактивный контент внутри элемента A, иногда вам может понадобиться обходной путь.
Вот например, где вам необходимо поместить интерактивный элемент внутри тега A. Эта маленькая кнопка закрытия в правом верхнем углу.
Вот HTML для этого. (Это не фактическая сборка, я сделал ее немного проще)
<a href="#">
<span class="hide">X</span> <!-- THIS IS THE SMALL 'X' WHICH HIDES THE WHOLE BOX -->
<img src="images/camera.svg" width="50" alt="Camera" />
<em>
Upload a profile picture
<small>
Here's the deal. Make your profile look awesome and even get 25 karma for it. We're not kidding.
</small>
</em>
<strong>
+ 25 K
</strong>
</a>
Итак, в основном мы хотим скрыть это поле, когда пользователь нажимает на «X». В противном случае, он должен работать как простой тег A. Вот jQuery, который сделал трюк.
$('.hide').click(function(e) {
e.preventDefault();
e.stopPropagation(); // THIS IS THE KEY PART
// DO WHATEVER YOU WANT, I FADED OUT THE BOX FOR EXAMPLE
$(this).parent().fadeOut(300);
});
Надеюсь, это поможет кому-то с той же проблемой. ;)
Оберните свою вложенную ссылку внутри тега объекта:
<a href="#" class="sp_mngt_bar">
<h1><?php echo $v; ?></h1>
<object><a href="#" class="t_icons t_icons_settings sp_mngt_settings"></a></object>
<object><a href="#" class="t_icons t_icons_move sp_mngt_move"></a></object>
</a>