Если все работает нормально при вызове из C, вы можете прекратить работу с Windbg, потому что DLL, вероятно, в порядке. Что-то не так с тем, как вызывается DLL, и как только DLL перезаписывает часть памяти LabView, все кончается, даже если может потребоваться 1000 итераций, прежде чем что-то действительно пойдет kablooey.
Сначала проверьте ваши соглашения о вызовах, C или StdCall. Соглашение о вызовах C используется по умолчанию, а StdCall - почти то, что вам нужно. (Проверьте файл заголовка DLL.) LabView 2009, очевидно, сделал некоторую автоматическую проверку и исправление соглашений о вызовах, но переход на LLVM в LV 2010 сделал это невозможным; теперь это просто танки.
Если после изменения этого значения все еще нет, проверьте ваши аргументы вызова еще раз. что вы передаете, скаляры или данные указателя? Вы не можете получить доступ к памяти, выделенной DLL из LabView, не выполняя некоторые хитрые действия, хотя вы можете выделить память (т.е. байтовый массив) в LabView и передать указатель на нее в DLL для ее изменения.
Кроме того, если вы получаете указатель (например, refnum) из более раннего вызова DLL и возвращаете его, проверьте размер указателя. Функция библиотеки вызовов LabView теперь имеет тип «целочисленный размер указателя», который генерирует тип соответствующего размера в зависимости от того, вызывается ли он в 32-битном или 64-битном LabView. (Это всегда 64 бит на проводе, потому что это должно быть определено во время компиляции.) Тот факт, что ваша DLL работает в 32, предполагает, что это возможно.
Также имейте в виду, что структуры C часто выравниваются компилятором (C). Если вы передаете указатель на структуру, состоящую из Uint8 и UInt16, компилятор C выделит для этого 32 бита (или, возможно, даже 64 бита). Вам нужно дополнить структуру (кластер) в LabView, чтобы она соответствовала, или написать DLL-оболочку для сборки структуры.
1011 * Роб *