P/Invoke на 64-разрядных окнах требуют различных подписей, чем на 32-разрядном?

Создайте макрос и используйте следующий код, чтобы захватить данные и поместить его в новый лист (Sheet2):

Dim strValue As String
Dim strCellNum As String
Dim x As String
x = 1

For i = 1 To 700 Step 7
    strCellNum = "A" & i
    strValue = Worksheets("Sheet1").Range(strCellNum).Value
    Debug.Print strValue
    Worksheets("Sheet2").Range("A" & x).Value = strValue
    x = x + 1
Next

Сообщенный мне, если это помогает! JFV

7
задан Brett Ryan 15 September 2009 в 10:12
поделиться

2 ответа

Несмотря на соглашение об именах, user32.dll (и другие 32 ... dll) на самом деле 64-битные на 64-битных машинах. Это исторические имена для библиотек DLL, и они остались неизменными независимо от изменений базовой архитектуры. Прочтите эту страницу, чтобы получить более подробную информацию.

12
ответ дан 6 December 2019 в 11:50
поделиться

Вам не следует не изменять подпись / имя библиотеки DLL, на которую вы ссылаетесь при вызове функций USER32.DLL.

Несмотря на соглашение об именах, на 64-битной машине Windows файл USER32.DLL, который находится в [Windows] \ System32, на самом деле является 64-битной DLL. настоящая 32-разрядная версия USER32.DLL на самом деле находится в папке с именем [Windows] \ SysWow64.

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

Тот самый то, о чем вам, вероятно, нужно быть особенно осторожным, - это типы данных, которые вы передаете в качестве параметров различным функциям Windows API. Например, функция «SendMessage» в USER32.DLL имеет определенное требование по крайней мере с одним из своих параметров (согласно странице в P / Invoke ).

Ее подпись: lParam. Ваш код БУДЕТ сбой на 64-битной окна. ТОЛЬКО используйте IntPtr, "ref" структура, или структура "out".

3) НИКОГДА не используйте "bool", "int" или "целое число" в качестве возвращаемого значения. Твой core БУДЕТ сбой в 64-битных окнах. ТОЛЬКО используйте IntPtr. Небезопасно использовать bool - pInvoke не может маршалировать IntPtr в логическое значение.

Это «предостережение», похоже, относится к этой конкретной функции (SendMessage), хотя на это я бы обратил особое внимание при вызове любых функций Windows API.

5
ответ дан 6 December 2019 в 11:50
поделиться
Другие вопросы по тегам:

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