Regsrv32 как зарегистрировать dll 1с

Обновлено: 03.07.2024

У меня возникла небольшая проблема с этим, и мои поиски в Google ничего не дают.

Не повезло с этим.

psexec \\(компьютер) regsvr32 c$\winnt\system32\spf37.dll

Могу ли я сделать это неправильно?

Я пишу скрипт и пытаюсь вставить в него такую ​​строчку.

спасибо заранее
затемнение

Вам нужно сделать это локально — если вы используете psexec, пытаетесь ли вы сделать это для поддержки своего собственного ПК? Как насчет того, чтобы попробовать это с локальной копией файла? Почему вы используете путь UNC? Что вы делаете, когда удаленного компьютера больше нет?

это попытается зарегистрировать удаленную dll в вашей системе. помните, контекст!

psexec \\(компьютер) regsvr32 c$\winnt\system32\spf37.dll

Могу ли я сделать это неправильно?

Я не слишком часто использую psexec, поэтому могу только догадываться о синтаксисе. но такой инструмент, как psexec, является правильным подходом. хотя, если это сервер, вы можете просто использовать терминальные службы для входа и регистрации dll.

но указанный вами путь неверен. вы говорите ему зарегистрировать файл "c$", что неверно. предположительно, при использовании psexec контекст пути будет локальным для этого поля, поэтому. c:\winnt\system32\spf37.dll будет правильным.

[Это сообщение было отредактировано Spiff 15 декабря 2003 г. в 14:14.]

Если вы пытаетесь сделать это с одним компьютером в локальной сети, просто подключитесь к нему с помощью управления компьютером, запустите службу telnet, войдите в telnet, выполните команду, выйдите и снова отключите telnet.

Теперь, если бы вам нужно было сделать это на группе компьютеров, это была бы другая история. Для этого я бы использовал Psexec и цикл FOR.

Дилберт, у тебя правильное представление о том, чем я хочу заниматься. Я хочу сделать это примерно на 200 ПК. Я хочу иметь три варианта
скрипт входа - простой
SMS - дерьмовый
и хороший маленький файл cmd с psexec.

Я подумывал о написании пакетного файла и выполнении Xcopy файла на всех машинах. а затем запустить psexec для пакетного файла

Поэтому я думал об этом
-------------------------------------------------
xcopy %logonserver\netlogon\spf37.dll c:\winnt\system32\*. /y
regsvr32 c:\winnt\system32\spf37.dll
-------------------------------------------- -----------
Вызвал todo.cmd
а затем запустил psexec

для /f %%i в (C:\machines.txt) выполните :runme %%i

Спасибо всем за помощь.

интересно, как вы не можете зарегистрировать dll удаленно, просто используя инструмент regsvr32.

Нам известно, что Sage 300 ERP позволяет настраивать стандартные экраны с именем OCX, отличным от стандартного имени. Всякий раз, когда мы выполняем какую-либо настройку в Sage 300, которая имеет новые файлы экрана и другие зависимые файлы, пользователь должен зарегистрировать их в Windows.

Бывают случаи, когда мы изменяем только несколько файлов в Sage, и это необходимо отразить в Sage 300 ERP. Всегда запускать REGACC нецелесообразно, так как Sage 300 занимает от нескольких минут до нескольких часов в зависимости от модулей, установленных в системе.

Выполните следующие действия, чтобы зарегистрировать/отменить регистрацию одной DLL/OCX:

Шаг 1. Запустите командную строку с правами администратора. Нажмите «Пуск», найдите cmd, щелкните правой кнопкой мыши и «Запуск от имени администратора».

Командная строка

Шаг 2. Зарегистрируйте файл DLL/OCX с помощью команды regsvr32, указав после regsvr32 путь к файлу DLL/OCX.

regsvr32 "D:\Program Files (x86)\Sage\Sage 300 ERP\OE65A\AccpacOE1100.ocx"

Зарегистрированный Ocx

Шаг 3. Отмените регистрацию файла DLL/OCX с помощью команды regsvr32, за которой следует regsvr32 и путь к файлу DLL/OCX.

regsvr32 /u "D:\Program Files (x86)\Sage\Sage 300 ERP\OE65A\AccpacOE1100.ocx"

Незарегистрированный Ocx

Теперь DLL/OCX успешно добавлена ​​в реестр Windows и готова к использованию.

О нас
Greytrix, всемирно известный партнер по разработке Premier Sage Gold, является универсальным поставщиком решений для потребностей Sage ERP и Sage CRM. Получив признание и вознаграждение за многолетний опыт работы нескольких человек, мы предлагаем полную комплексную помощь для ваших технических консультаций, настройки продукта, переноса данных, системной интеграции, разработки надстроек третьих сторон и экспертизы внедрения.

Но это не работает для меня. Как зарегистрировать DLL-файл в Windows 7 с 64-разрядным процессором?


15 ответов 15

Ну, вы не указываете, является ли это 32-битной или 64-битной dll, и не включаете сообщение об ошибке, но я предполагаю, что это та же проблема, что описана в этой статье базы знаний: Сообщение об ошибке при запуске Regsvr32.exe в 64-разрядной версии Windows

Цитата из этой статьи:

Это происходит из-за того, что файл Regsvr32.exe в папке System32 является 64-разрядной версией. При запуске Regsvr32 для регистрации библиотеки DLL по умолчанию используется 64-разрядная версия.

Решение из этой статьи:

Чтобы решить эту проблему, запустите Regsvr32.exe из папки %SystemRoot%\Syswow64. Например, введите следующие команды для регистрации библиотеки DLL: cd \windows\syswow64 regsvr32 c:\filename.dll

Это действительно должен быть правильный ответ. Я могу понять, что в его исходном сообщении синтаксис был неправильным, но Раджкумар прокомментировал, что он получал сообщение об ошибке даже при использовании правильного синтаксиса. Это занимает два шага до правильного ответа для кого-то, кто ищет, вместо одного. Сначала к ответу, выбранному как правильный, затем по цепочке комментариев и в итоге к этому сообщению.

Если DLL 32 бит:

Скопируйте DLL в C:\Windows\SysWoW64\
В командной строке с повышенными привилегиями: %windir%\SysWoW64\regsvr32.exe %windir%\SysWoW64\namedll.dll

если DLL 64 бит:

Скопируйте DLL в C:\Windows\System32\
В командной строке с повышенными привилегиями: %windir%\System32\regsvr32.exe %windir%\System32\namedll.dll

Я знаю, что это кажется неправильным, но так оно и есть. См.:

http://support.microsoft.com/kb/249873
Цитата: "Примечание. В 64-разрядной версии операционной системы Windows существует две версии файла Regsv32.exe:
>64-разрядная версия — %systemroot%\System32\regsvr32.exe.
32-разрядная версия — %systemroot%\SysWoW64\regsvr32.exe.
"

Введите regsvr32 name.dll в командную строку (в режиме с повышенными привилегиями!) и нажмите «Ввод». Обратите внимание, что name.dll следует заменить именем библиотеки DLL, которую вы хотите зарегистрировать. Например, если вы хотите зарегистрировать iexplore.dll, введите regsvr32 iexplore.dll .



В системе x64 system32 предназначен для 64-разрядной версии, а syswow64 — для 32-разрядной (а не наоборот, как указано в другом ответе). WOW (Windows в Windows) — это 32-разрядная подсистема, работающая под управлением 64-разрядной подсистемы).

Это беспорядок в терминах именования, и он служит только для того, чтобы запутать, но так оно и есть.

syswow64 является 32-битным, а НЕ 64-битным.

system32 64-битная, НЕ 32-битная.

В каждом из этих каталогов есть файл regsrv32. Один 64-битный, другой 32-битный. То же самое с odbcad32 и др. (Если вы хотите увидеть 32-разрядные драйверы ODBC, которые не будут отображаться с odbcad32 по умолчанию в 64-разрядной системе system32.)


Откройте меню "Пуск" и введите cmd в поле поиска. Удерживайте Ctrl + Shift и нажмите Enter

Это запустит командную строку в режиме администратора.

Теперь введите: regsvr32 MyComobject.dll

Если DLL 32-битная:

  1. Скопируйте DLL в C:\Windows\SysWoW64\
  2. В cmd с повышенными привилегиями: %windir%\SysWoW64\regsvr32.exe %windir%\SysWoW64\namedll.dll

если DLL 64-битная:

  1. Скопируйте DLL в C:\Windows\System32\
  2. В cmd с повышенными привилегиями: %windir%\System32\regsvr32.exe %windir%\System32\namedll.dll

Наконец-то я нашел решение: просто запустите CMD от имени администратора и напишите

затем напишите это

Надеюсь, этот ответ поможет вам


Если вы уже скопировали файл filename.dll в папку syswow64 и изменили рабочий каталог на syswow64 в командной строке, то "c:\" в "regsvr32 c:\filename.dll" не требуется. Короче говоря, "regsvr32 c:\filename.dll" должно читаться как "regsvr32 filename.dll"

Здесь все шло не так, как по неправильному пути. Затем я вспомнил трюк из старых дней Win95. Откройте папку программы, в которой находится .dll, откройте C:/Windows/System32, прокрутите вниз до regsvr32 и перетащите dll из папки программы на rgsrver32. Бум, готово.

Знание сообщения об ошибке было бы весьма полезным. Он предназначен для предоставления информации, даже если она не имеет для вас никакого смысла, а для нас. Вынужденный гадать, я бы сказал, что DLL представляет собой 32-битный фильтр DirectX. В этом случае это должно быть правильным курсом действий:


Я только что протестировал этот очень простой метод, и он отлично работает, но я использую встроенную учетную запись администратора, поэтому мне не нужно прыгать через обручи для получения повышенных привилегий.

Следующий пакетный файл избавляет пользователя от необходимости перемещать файлы в/из системных папок. Кроме того, Windows оставляет за собой возможность применить правильную версию Regsvr32 .

ИНСТРУКЦИИ:

В папке, содержащей файл библиотеки (-.dll или -.ax), который вы хотите зарегистрировать, откройте новый текстовый файл и вставьте в него ОДНУ из приведенных ниже процедур:

Сохраните новый текстовый файл как пакетный (-.bat) файл; затем просто перетащите файл -.dll или -.ax поверх пакетного файла.

Если UAC не дает вам возможности запустить пакетный файл от имени администратора, вам может потребоваться повысить привилегии вручную (инструкции приведены для Windows 7):

  1. Щелкните правой кнопкой мыши пакетный файл;
  2. Выберите Создать ярлык ;
  3. Щелкните правой кнопкой мыши ярлык;
  4. Выберите свойства ;
  5. Перейдите на вкладку "Совместимость".
  6. Установите флажок "Выполнять эту программу от имени администратора";
  7. Перетащите файл -.dll или -.ax поверх нового ярлыка вместо пакетного файла.

Вот и все. Я выбрал COPY вместо MOVE , чтобы предотвратить сбой любых последующих попыток, связанных с UAC. За успешной регистрацией должно последовать удаление исходного файла библиотеки ( -.dll или -.ax ).

Не беспокойтесь о копиях, сделанных в системную папку ( C:\Windows\System32 или C:\Windows\SysWOW64 ) предыдущими проходами. - они будут перезаписываться каждый раз, когда вы запускаете пакетный файл.

Если вы не запустили неправильный пакетный файл, в этом случае вы, вероятно, захотите удалить копию, сделанную не в ту системную папку ( C:\Windows\System32 или C:\Windows\SysWOW64 ) перед запуском соответствующего пакетного файла, . или.

Помогите Windows выбрать правильный файл библиотеки для регистрации, полностью указав его расположение в каталоге.

  1. Из правого пакетного файла скопируйте путь к системной папке
    • Для 64-разрядной версии: C:\Windows\System32
    • Для 32-разрядной версии: C:\Windows\SysWOW64
  2. Вставьте его на следующую строку так, чтобы он предшествовал %nx1
    • Для 64-разрядной версии: regsvr32 "C:\Windows\System32\%nx1"
    • Для 32-разрядной версии: regsvr32 "C:\Windows\SysWOW64\%nx1"
      • Вставьте путь в кавычки
      • Вставьте обратную косую черту, чтобы отделить %nx1 от пути к системной папке.
    • или .

Уж точно не 1С позволяет пользователю использовать функции 32 Win API. Эту возможность можно решить с помощью ActiveX OLE-клиентов, таких как dynwrap.dll или dynwrapx.dll, причем dynwraph.dll сильно интересует своими возможностями.

Немного истории: библиотека dynwrap.dll является результатом работы нескольких разработчиков и выпущена 10 лет назад. Основное назначение функций вызова Win 32 API WHS скриптов. В сентябре 2008 года вышла новая расширенная версия библиотеки dynwraph.dll, на примере которой мы и остановились.

Пример использования библиотеки для отправки сообщений в почтовый ящик \messngr аля Net Send:

Для начала пропишется:
regsvr32.exe

\dynwrapx.dll - для всех пользователей.
regsvr32.exe / i

\dynwrapx.dll — для текущего пользователя.

С помощью 1С - Wrap = CreateObject("DynamicWrapperX"); зарегистрировать дальнейшие вызовы функций

Wrap.Register( "KERNEL32.DLL", "CreateFile", "i = sllllll", "r = l");
Wrap.Register( "KERNEL32.DLL", "WriteFile", "i = lllll", "r = l");
Wrap.Register ("KERNEL32.DLL", "CloseHandle", "i = l", "r = l");

GENERIC_READ = 2147483648;
GENERIC_WRITE = 1073741824;
FILE_SHARE_READ = 1;
FILE_SHARE_WRITE = 2;
OPEN_EXISTING = 3;
FILE_ATTRIBUTE_NORMAL = 128;
MessageText = AnsiToOem ("Привет!");
AddFrom = AnsiToOem ("От друзей");
AddTo = "СЕРВЕР";
MailslotName = "\\" + AddTo + "\ mailslot \ messngr";
If Wrap <> 0 Then
hFile = Wrap.CreateFile (MailslotName, GENERIC_WRITE, FILE_SHARE_READ, 0,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
If hFile> 0 Then
// Структура MSG должна быть
// FromName + CHR (0) + ToComp + CHR (0) + MSG + CHR (0) + CHR (0)
// Длина не более 424 символов
MSG = Wrap.Space(425);

Обязательно запомните ссылку на переменную
pStr = Wrap.StrPtr (MSG);
BytesBeSend = 0;
Для i = 1 по циклу StrDlina (AddFrom)
Wrap.NumPut(KodSimv(Avg(AddFrom,i,1)),pStr,BytesBeSend,"b");
BytesBeSend = BytesBeSend +1;
Конец Цикла;
Wrap.NumPut(0, pStr, BytesBeSend, "b");
BytesBeSend = BytesBeSend +1;
Для i = 1 по циклу StrDlina (AddTo)
Wrap.NumPut (KodSimv (Avg (AddTo, i, 1)), pStr, BytesBeSend, "b");
BytesBeSend = BytesBeSend +1;
Конец Цикла;
Wrap.NumPut(0, pStr, BytesBeSend, "b");
BytesBeSend = BytesBeSend +1;
Для i = 1 Цикл By StrDlina (MessageText)
Quds = KodSimv (Avg (MessageText, i, 1));
Обернуть.NumPut(Qods, pStr, BytesBeSend, "b");
BytesBeSend = BytesBeSend +1;
Конец Цикла;
Wrap.NumPut(0, pStr, BytesBeSend, "b");
Отправить по байтам = Отправить по байтам +1;
Wrap.NumPut(0, pStr, BytesBeSend, "b");
BytesBeSend = BytesBeSend +1;
cbWritten = "";
pcbWritten = Wrap.StrPtr(cbWritten);
fResult = Wrap.WriteFile(hFile, pStr, BytesBeSend, pcbWritten, 0);
Wrap.CloseHandle (hFile);
Если fResult = 1, то
cbWritten = Wrap.NumGet (pcbWritten, 0, "l");
Если cbWritten> 0 Тогда
Отчет ("Доставлено");
иначе
Сообщить ("Сообщение не отправлено");
КОНЕЦ;
ENDIF;

Вот и все сообщение было отправлено или не отправлено :-) самое главное при использовании функция возвращает значение, либо передается с помощью структур передачи/приема в данном примере это указатель на строку содержащую 3 секцию From To отчет после каждого символа 0 и в конце ведущего 0. Данную структуру установить штатными средствами 1С "очень сложно".

Это только один пример. В библиотеке MSDN вы можете найти множество полезных функций.

Этот пример позволяет реализовать "копирование файла", при чем, как показал опыт, максимальная скорость достигается за счет использования буфера данных 65535 байт в этой дорожке, возможно копирование (%, несколько индикаторов выполнения, возобновление) и, конечно же, выполнение не забываем про разгрузку CPU 1 мс.

Пример №2 Получение абсолютных координат окна

Зарегистрировать функцию

Wrap.Register( "USER32.DLL", "GetWindowRect", "i = lp", "r = l");
1 параметр - дескриптор окна (можно найти как минимум 2 варианта 1 заголовок, 2 класс) или использовать ВК Formex (респект! Разработчику)
2 ссылка на структуру Rect (тип)
typedef struct _RECT
<
LONG left;
ДЛИННЫЙ топ;
ДЛИННОЕ право;
ДЛИННОЕ дно;
> ПРЯМО, * ПРЯМО;

1с немного кузяво
Rect = Wrap.Space(256); // Должно быть 4 DWord
Обязательно сохраните указатель на переменную
pStr = Wrap.StrPtr(Rect);
Wrap.GetWindowRect(ДискрипторОкна, Rect);
Учитывая, что такого типа данных в 1С не существует, Rect 1С убил - но перейти по сохраненному указателю
и вычитается только потому, что Rect
left = Wrap.NumGet(pStr, 0 , "л");
top = Wrap.NumGet(pStr, 4, "l");
право = Wrap.NumGet(pStr, 8, "l");
внизу = Wrap.NumGet (pStr, 12, "l");

Не забываем, что у нас есть абсолютные координаты окна (компонент формы и m) внизу, мы можем изменить размер окна (минимум 3 способа Win 32 API + FormEx).

Чуть позже рассмотрим пример, как все-таки обработать внешнее событие, если окно не имеет фокуса, или открыть выпадающее меню на форме (созданной в разных версиях ПМ и обычной - ВыбратьЗначение )

Читайте также: