Всем привет.
В gdi32 есть функция GetTextExtentExPoint.
Проект портирован в VB.NET из VB6. Там функция была описана следующим образом:
Declare Function GetTextExtentExPoint Lib "gdi32" Alias "GetTextExtentExPointA" (ByVal hdc As Integer, ByVal lpszStr As String, ByVal cchString As Integer, ByVal nMaxExtent As Integer, ByRef lpnFit As Integer, ByRef alpDx As Integer, ByRef lpSize As Size) As Integer
Все работало как ожидалось.
В .NET декларация переделана под юникод:
Declare Unicode Function GetTextExtentExPoint Lib "gdi32" Alias "GetTextExtentExPointW" (ByVal hdc As Integer, ByVal lpszStr As String, ByVal cchString As Integer, ByVal nMaxExtent As Integer, ByRef lpnFit As Integer, ByRef alpDx As Integer, ByRef lpSize As Size) As Integer
При вызове со строкой длиннее 3 символов (параметр lpszStr) функция умудряется испортить локальные переменные вызывающей функции. Всяческие манипуляции с атрибутами на ситуацию не влияют.
Экспериментами установлено, что если объявить параметр alpDx как
ByVal, то проблема снимается. В текущим коде параметр не нужен, он всегда null. Однако никто не может гарантировать, что он никогда в будущем не понадобится.
Вопрос очевиден — что это такое и как с этим бороться?
PS: большая просьба не предлагать переделать все на System.Drawing. Решение очевидно, но для этого не надо задавать вопрос

.
Здравствуйте, aloch, Вы писали:
A>Вернее — http://pinvoke.net/search.aspx?search=GetTextExtentExPoint
Спасибо, конешно, но что-то там информации не густо...
Здравствуйте, fenrus, Вы писали:
F>Спасибо, конешно, но что-то там информации не густо...
Информации достаточно густо в описании этой функции в MSDN. По-моему, именно на это описание и стоит ориентироваться как на первоисточник, вместо использования чьей-то её интерпритации при импорте в VB
Здравствуйте, Jolly Roger, Вы писали:
JR>Здравствуйте, fenrus, Вы писали:
F>>Спасибо, конешно, но что-то там информации не густо...
JR>Информации достаточно густо в описании этой функции в MSDN. По-моему, именно на это описание и стоит ориентироваться как на первоисточник, вместо использования чьей-то её интерпритации при импорте в VB
Не стал бы я задавать глупые вопросы, не изучив предварительно MSDN...
В том-то и проблема, что все написанное в нем я уже попробовал — безрезультатно.
Здравствуйте, fenrus, Вы писали:
F>Не стал бы я задавать глупые вопросы, не изучив предварительно MSDN...
F>В том-то и проблема, что все написанное в нем я уже попробовал — безрезультатно.
В таком случае мне не понятны Ваши затруднения. Это
умудряется испортить локальные переменные
— порча стека потока. Происходит из-за неправильного объявления функции — а оба приведённые Вами варианты неправильны. По ссылкам приведены правильные объявления, а в MSDN подробно описаны все параметры и что в них следует передавать. Что именно Вы пробовали и что значит безрезультатно, остаётся совершенно непонятно.