저는 등록 없이도 무료 COM 기술을 사용하여 WSH 스크립팅을 성공없이 작동 시키려고했습니다. 나는이 문제에 대한 많은 답변을 읽었으며 성공하지 못한 채로 많은 것을 시도했다. 이제는 아래에 몇 가지 추가 정보를 제공하는 코드에서 올바르지 않은 부분을 수정하는 데 도움이 필요합니다.있음 WSH (vbscript/javascript)로 등록 무료 COM 예제의 간단하고 확실하게 작동하는 데모가 필요합니다.
테스트 목적으로 C-com 클래스 라이브러리 (C_Com_Demo.dll로 컴파일 됨)가 있습니다. Visual Studio 2015에서 "어셈블리 COM 표시"확인란을 선택하고 "Visual Studio 호스팅 프로세스 사용"및 "COM 등록 interop "이 선택되지 않았습니다.
C_Com_Demo.dll은 경로에 "C : \ 도구 \ COM \ C_Com_Demo.dll"여기
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace testClass
{
[ComVisible(true)]
public class StringOperations
{
[ComVisible(true)]
public string getValue1(string sParameter)
{
switch (sParameter)
{
case "a":
return "A was chosen";
case "b":
return "B was chosen";
case "c":
return "C was chosen";
default:
return "Other";
}
}
public string getValue2()
{
return "From VBS String Function";
}
}
}
이 될 수있는만큼 간단한 매니페스트 파일입니다
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Minimalist Manifest -->
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<file name = "C_Com_Demo.dll">
<comClass clsid="{9d3e378b-d20e-43bc-a49f-e7e002eee72e}"
progid = "C_Com_Demo"/>
</file>
</assembly>
새로운 매니페스트 파일 버전 : "C : \ 도구 \ COM \ C_Com_Demo.manifest"
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Minimalist Manifest -->
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<file name = "C_Com_Demo.dll"/>
<clrClass clsid="{9d3e378b-d20e-43bc-a49f-e7e002eee72e}"
name="C_Com_Demo"/>
</assembly>
"C_Com_Demo.manifest는"DLL과 동일한 위치에 또한
내 OS는 Windows 10 (64 비트)입니다. 따라서 플랫폼 대상을 x64로 설정했습니다. 닷넷 프레임 워크 4
로 설정 그리고 저는 여기에 방법에게 COM 객체의 전화를 시도하는 의해 WSH/VBScript를하다 :
Set actCtx = WScript.CreateObject("Microsoft.Windows.ActCtx")
actCtx.Manifest = "C:\Tools\com\C_Com_demo.manifest"
Set DX = actCtx.CreateObject("testClass.StringOperations")
MsgBox DX.getValue1("a")
VBScript를이 같은 경로도에 위치를
RegAsm.exe 또는 VS의 빌드 옵션 "COM interop에 등록"을 통해 Com 클래스를 등록하면 WSH/vbscript가 실제로 작동하지만 원하는 목표는 등록 무료 기술을 통해 com 클래스를 획득하는 것은 아직 작동하지 않습니다. 이 오류는 항상 제 3 회 라인 (세트 DX = actCtx.CreateObject ("testClass.StringOperations"))에 와서
ActiveX-component cannot create the object, Code: 800A01AD.
사람이 나는 그것이 작동되도록하려면 위의 코드를 변경해야 무슨 말을 할 수 말한다 -에 대한 I를 정말 이걸로 붙어 있습니까?
COM이면 'regsvr32.exe'를 사용하여 레지스트리에 'progid'를 등록하면 안됩니까? – Lankymart
progid가 올바르지 않기 때문에 매우 빨리 종료됩니다. "C_Com_Demo"가 아니라 "testClass.StringOperations"입니다. 유일한 문제가 아니라'comClass' 대신에'assemblyIdentity'와'clrClass' 엘리먼트를 사용해야합니다. 이 특정 시나리오에서 CLR은 DLL을 찾는 데 어려움을 겪습니다. wscript.exe가 (boo)에 있거나 GAC에 설치해야하므로 c : \ windows \ system32에 복사해야합니다. –
comClass 대신 clrClass를 추가했지만 매니페스트 유효성 검사에서는 최소 요구 사항 인 name 속성과 함께 assemblyIdentity 요소를 허용하지 않았습니다. 위와 같이 매니페스트 파일을 업데이트했습니다. 나는 또한 c : \ windows \ system32에 dll을 대처하려고 노력했다. 이것은 아직 문제를 해결하지 못했습니다. –