응용 프로그램에서 UWP (메트로 앱) 기능 사용하기

Programming 2019. 3. 21. 10:51

UWP앱이 아닌 경우에는 기본적으로 UWP의 기능들을 사용할 수가 없다

해당 기능들을 사용하려면 따로 Windows.winmd를 참조해주면 된다


참조 관리자에 Windows.winmd는 기본적으로는 없으므로 찾아보기를 누른다

Windows.winmd 파일을 Windows SDK 폴더에 들어가 있는데

해당 경로는 따로 변경하지 않았을 경우에 아래 폴더안에 들어가 있다.

32비트 : C:\Program Files\Windows Kits, 64비트 : C:\Program Files (x86)\Windows Kits


해당 폴더에 들어가서 사용할 운영체제 버전을 선택하고

UnionMetadata 폴더 들어가서 원하는 버전을 고르면 된다

예. "C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.17763.0\Windows.winmd"


하지만 이것만 추가하면 몇 기능들을 사용할수가 없는데 (await 등)

해당 기능들을 사용하려면 아래의 라이브러리들을 참조해야 한다


System.Runtime.InteropServices.WindowsRuntime

System.Runtime.WindowsRuntime

위 두개를 참조에 추가를 해주어야 되는데

해당 참조들은 어셈블리에 따로 존재하지 않고

런타임 폴더에 있으니 찾아서 넣어주면 된다

닷넷 프레임워크 기준으로 아래 폴버에서 원하는 버전을 고른 후 Facades에 들어가면 있다

32비트 : C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\

64비트 : C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\


예. "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2\Facades"


해당 파일들을 모두 참조했으면 이제 사용하면 된다.

중간부터 사진 넣기 귀찮네

posted by 자칭 프로그래머ㅡ ModMapper

지니뮤직 재생 매크로

Programming/C# 2019. 2. 4. 07:55

지니뮤직에서 미디어 키를 사용할수 있게 해주는 프로그램.


지니뮤직 쓰는데 미디어 키로 컨트롤이 안되서 빡쳐서 만들었습니다.

급하게 대충 만들어서 다른 컴퓨터에서의 실행은 보장 못함.


재생하고 다음, 이전 트랙 세개만 연결해놨습니다.

추가로 정지 키 누르면 종료됩니다.


소스코드 공개 : https://github.com/ModMapper/JMPMacro


JMPMacro.exe


'Programming > C#' 카테고리의 다른 글

지니뮤직 재생 매크로  (0) 2019.02.04
posted by 자칭 프로그래머ㅡ ModMapper

Map Compressor - 스타크래프트 맵 압축 프로그램

Starcraft/StarCraft Files 2017. 6. 24. 03:41

Chk 프로텍션은 따로 적용되어 있지 않습니다. 다른 프로텍터와 겸용하세요.


평균 30%에서 최대 50% 이상 추가 압축합니다.

사용법은 따로 적어놓지 않겠습니다.


사용후 압축률을 적어주시면 감사하겠습니다.


- 버그 수정 및 속도 개선


Map Compressor.rar

'Starcraft > StarCraft Files' 카테고리의 다른 글

Map Compressor - 스타크래프트 맵 압축 프로그램  (8) 2017.06.24
SMC Recover [SMC 언프로텍터]  (14) 2016.04.24
MPQ Repair 1.1.0  (6) 2012.03.24
posted by 자칭 프로그래머ㅡ ModMapper

TkMPQLib

Project/TkMPQLib 2017. 6. 19. 02:47

Tk MPQ Library 8.0


MPQ를 읽거나 작성하는 닷넷 프레임워크 라이브러리 입니다.

제작 : modmapper (modmapper@tkyuki.kr)

Compatible .Net Framework 4.0 (Windows XP or Older)

Compatible .Net Standard 1.1 (별도)


변경 사항

1. 압축 라이브러리 개선

2. 일부 함수 개선

3. 버그 수정

4. 안정성 강화


약간의 수정사항이 있습니다. 7.0하고 호환됩니다.

궁금한거 있으면 질문하세요.


TkMPQLib.dll

TkMPQLib.xml

'Project > TkMPQLib' 카테고리의 다른 글

TkMPQLib  (0) 2017.06.19
MPQ 파일 읽기 예제  (0) 2016.09.20
TkMPQLib 설명  (0) 2016.09.20
posted by 자칭 프로그래머ㅡ ModMapper

VB .Net에서의 .NET 표준 사용

Programming/Visual Basic 2017. 5. 20. 15:09

VB. Net의 템플릿에는 .Net 표준(.Net Standard)이 기본적으로는 없는데

(나중에 추가 될꺼라고 생각하기는 하지만)

약간 돌아가면 사용하는 방법이 있다



먼저 새 프로젝트에서 이식 가능한 클래스 라이브러리를 생성한다

그리고 프로젝트 속성에 들어가면 아래와 같이 .NET 플랫폼 표준을 대상으로 지정이 있을 것이다

적용하려면 저장이 필요하기에 모두 저장을 통해 프로젝트를 한번 저장해주자

우리는 .NET 표준을 사용할 것이기 때문에 확인을 눌러준다

확인을 누르고 나면 아래와도 같이 .NET 표준으로 바뀌어 있다


여기까지 왔으면 다 된것 같지만 아직 해야 할 일이 남아있다


기본적으로 .NET 표준에서는모듈을 사용할수가 없는데

그래서 NuGet을 통해 "Microsoft.VisualBasic" 라이브러리를 따로 받아줘야 한다

해당 라이브러리는 Nuget 패키지 관리자를 통해 받을 수도 있고


아래와 같이 패키지 관리자 콘솔을 통해 다운로드 받을 수 있다

프리 릴리즈는 버그가 있을 수 있으니 안정적인 버전을 추천한다 (NuGet의 사용법을 모른다면 인터넷에 검색을 해 볼것)

그럼 이제 VB .Net을 통해 .NET 표준을 사용할 수 있다. 끝

posted by 자칭 프로그래머ㅡ ModMapper

VS Code

카테고리 없음 2017. 5. 19. 23:01
using System;

public int main() {
String Hello = "Hello, World!";
Console.WriteLine(Hello);
return;
}

음..

posted by 자칭 프로그래머ㅡ ModMapper

알송의 가사 가져오는 코드

Programming/Visual Basic 2017. 5. 13. 20:31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
Imports System.Text
Imports System.Net
Imports System.IO
Imports System.Xml
Imports System.Security
 
Module ParseAlSong
    Private Const URL As String = "http://lyrics.alsong.co.kr/alsongwebservice/service1.asmx"
 
    Private Const SendXML As String =
        "<?xml version=""1.0"" encoding=""UTF-8""?>" & vbCrLf &
        "<SOAP-ENV:Envelope " &
            "xmlns:SOAP-ENV=""http://www.w3.org/2003/05/soap-envelope"" " &
            "xmlns:SOAP-ENC=""http://www.w3.org/2003/05/soap-encoding"" " &
            "xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" " &
            "xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" " &
            "xmlns:ns2=""ALSongWebServer/Service1Soap"" " &
            "xmlns:ns1=""ALSongWebServer"" " &
            "xmlns:ns3=""ALSongWebServer/Service1Soap12"">" & vbCrLf &
        "  <SOAP-ENV:Body>" & vbCrLf &
        "    <ns1:GetLyric5><ns1:stQuery>" & vbCrLf &
        "    <ns1:strChecksum>{0}</ns1:strChecksum>" & vbCrLf &
        "    <ns1:strVersion></ns1:strVersion>" & vbCrLf &
        "    <ns1:strMACAddress></ns1:strMACAddress>" & vbCrLf &
        "    <ns1:strIPAddress></ns1:strIPAddress>" & vbCrLf &
        "    </ns1:stQuery></ns1:GetLyric5>" & vbCrLf &
        "  </SOAP-ENV:Body>" & vbCrLf &
        "</SOAP-ENV:Envelope>"
 
    Public Structure AlSongInfo
        Dim ID As Integer
        Dim RegistDate As Date
        Dim Title As String
        Dim Artist As String
        Dim Album As String
        Dim CGood As Integer
        Dim CBad As Integer
        Dim Lyric As String
        Dim FirstRegister As AlSongRegister
        Dim CurrentRegister As AlSongRegister
    End Structure
 
    Public Structure AlSongRegister
        Dim Name As String
        Dim eMail As String
        Dim URL As String
        Dim Phone As String
        Dim Comment As String
    End Structure
 
    Public Function GetMP3Info(FileName As StringAs AlSongInfo
        Using FS = New FileStream(FileName, FileMode.Open, FileAccess.Read)
            Return GetMP3Info(FS)
        End Using
    End Function
 
    Public Function GetMP3Info(Stream As Stream) As AlSongInfo
        '오디오 프레임에서 163840 바이트를 읽어 해시 값을 구함
        '해당 코드에서는 NuGet의 ID3를 사용함
        Const SampleSize As Integer = 163840
        Dim MD5 = Cryptography.MD5.Create()
        Dim Hash() As Byte
        Using MP3 As New Id3.Mp3Stream(Stream)
            Hash = MD5.ComputeHash(MP3.GetAudioStream(), 0, SampleSize)
        End Using
        Return GetInfo(BitConverter.ToString(Hash).Replace("-""").ToLower())
    End Function
 
    Public Function GetInfo(Checksum As StringAs AlSongInfo
        Dim Request = HttpWebRequest.CreateHttp(URL)
        Request.KeepAlive = False
        Request.Method = "POST"
        Request.UserAgent = "gSOAP/2.7"
        Request.ContentType = "application/soap+xml; charset=utf-8"
        Request.Headers.Add("SOAPAction""""ALSongWebServer/GetLyric5""")
        Using Stream = Request.GetRequestStream()
            WriteStream(Stream, Checksum)
        End Using
        Using Response = Request.GetResponse()
            Using Stream = Response.GetResponseStream()
                Return ParseStream(Stream)
            End Using
        End Using
    End Function
 
 
    Private Sub WriteStream(Stream As Stream, Checksum As String)
        Dim XML = Encoding.UTF8.GetBytes(String.Format(SendXML, Checksum))
        Stream.Write(XML, 0, XML.Length)
    End Sub
 
    Private Function ParseStream(Stream As Stream) As AlSongInfo
        Dim XML As New XmlDocument()
        XML.Load(Stream)
        Dim Node = XML.SelectSingleNode("*/*/*/*")
        If Node Is Nothing Then Return Nothing
        Dim Info As AlSongInfo
        With Info
            .ID = GetNodeValue(Node, "strInfoID")
            .RegistDate = GetNodeValue(Node, "strRegistDate")
            .Title = GetNodeValue(Node, "strTitle")
            .Artist = GetNodeValue(Node, "strArtist")
            .Album = GetNodeValue(Node, "strAlbum")
            .CGood = GetNodeValue(Node, "strCountGood")
            .CBad = GetNodeValue(Node, "strCountBad")
            .Lyric = GetNodeValue(Node, "strLyric").Replace("<br>", vbCrLf)
 
            .FirstRegister.Name = GetNodeValue(Node, "strRegisterFirstName")
            .FirstRegister.eMail = GetNodeValue(Node, "strRegisterFirstEMail")
            .FirstRegister.URL = GetNodeValue(Node, "strRegisterFirstURL")
            .FirstRegister.Phone = GetNodeValue(Node, "strRegisterFirstPhone")
            .FirstRegister.Comment = GetNodeValue(Node, "strRegisterFirstComment")
 
            .CurrentRegister.Name = GetNodeValue(Node, "strRegisterName")
            .CurrentRegister.eMail = GetNodeValue(Node, "strRegisterEMail")
            .CurrentRegister.URL = GetNodeValue(Node, "strRegisterURL")
            .CurrentRegister.Phone = GetNodeValue(Node, "strRegisterPhone")
            .CurrentRegister.Comment = GetNodeValue(Node, "strRegisterComment")
        End With
        Return Info
    End Function
 
    Private Function GetNodeValue(Node As XmlElement, Name As StringAs String
        Dim SubNode = Node.GetElementsByTagName(Name)
        If SubNode.Count = 0 Then Return ""
        Return SubNode(0).InnerText
    End Function
End Module
 
cs


Lyric이 가사임

posted by 자칭 프로그래머ㅡ ModMapper

스타크래프트 chk의 구조

Starcraft/scenario.chk 2016. 12. 16. 02:14
  • 저런 구조들을 어떻게 분석해서 뭐가 뭔지 알아내는게 참 신기하단말이죠.

    제온 2017.04.18 14:37

먼저 이 강좌는 프로그래밍을 약간이라도 아는 사람이라는 기준 하에 쓰여졌다는 점을 알린다.



스타크래프트 맵의 chk(이하 청크) 는 여러개의 구휙이 구조는 리스트와 비슷한 구조로 배치되어 있다.

그래서 리스트와 읽는 방법이 같으며. 현재 위치가 파일의 끝 이상이 될 시 읽기를 종료한다.

[스타크래프트 chk의 예]


각 구휙은 4바이트 문자열의 이름 그리고 4바이트 정수의 크기 그리고 내용 (가변 크기)로 이루어져 있다.

그것을 코드로 표현하면 아래와도 같은 모습을 보이게 된다.

0

1

2

3

4

5

typedef struct {

    /* 4바이트 문자 */ Char Name[4];

    /* 4바이트 정수 */ Int32 Size;

    Void* Data;

Section;

 

[chk 섹션의 구조]





그렇다면 이 구휙들을 읽는 방법은 간단하다.

단계적으로 읽어나가서 필요한 구휙을 찾고, 원하는 값을 가져오면 되는 것이다.

아래는 구휙을 읽어 원하는 구휙을 가져오는 코드이다.


0

1

2

3

4

5

6

7

8

9

10

Void* GetSection(VoidpvBufferInt32 cbBufferCharName) {

    Void* BufferEnd = (Byte*)pvBuffer + cbBuffer;

    Int32 Size;

    while (BufferEnd > pvBuffer) {

        if (*(Int32*)Name == *(Int32*)pvBufferreturn (Byte*)pvBuffer + 4;

        pvBuffer = (Byte*)pvBuffer + 4;

        pvBuffer = (Byte*)pvBuffer + 4 + *(Int32*)pvBuffer;

    }

    return nullptr;

}

 

[메모리에서 원하는 구휙을 코드]


허나 우리가 해야할 것은 읽기 뿐만이 아닌 작성 또한 해야한다는 점이다.

강좌를 작성하는 이유는 많은 사람들이 지식을 얻고 가기 하기 위함인데.

C++은 메모리를 직접 관리하는데 탁월하지만 난이도가 높다.

그러므로 이제부터 비교적 난이도가 낮은 VB .Net으로 코드를 사용해 보겠다.


추가로 여기서 VB .Net을 선택한 이유는 아래와도 같다.

1. 내가 VB .Net을 주력으로 사용한다. (중요)

2. VB는 다른 사람이(초보자가) 사용하기 쉬위 여러 간단한 프로그램에서 사용된다.

3. 닷넷 프레임워크의 자원 사용할 수 있다.


참고로 작성일 기준으로 C#보다 VB .Net의 점유율이 약간 우세하다


[참조 : http://www.tiobe.com/tiobe-index/]


너무 잡다한 소리가 많았나? 그렇다면 이제 본격적으로 시작해 보겠다.

우리가 알아두어야 할 것은 우리는 수시로 추가와 제거를 해야 할 것이라는 점이다.

그래서 List와 MemoryStream를 사용하기로 했다. 왜냐하면 배열은 확장을 시도하면 자원 낭비가 심해지기 때문이다.

무슨 소리인지 모르겠다면 그냥 넘어가도 좋다. 그렇게 읽기와 작성 코드는 아래와도 같다.


0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

'스타크래프트 chk의 구조 - Chunk의 읽기와 작성

'Code by ModMapper

 

Imports System.Collections.Generic

Imports System.Text

Imports System.IO

 

''' <summary>Chunk를 읽거나 작성하는 모듈입니다.</summary>

Module Chunk

    ''' <summary>Chunk 구휙 형식</summary>

    Public Structure Section

        Dim Name As String          '구휙 이름

        Dim Data As MemoryStream    '구휙 내용

    End Structure

 

    ''' <summary>파일에서 Chunk를 읽는 함수.</summary>

    ''' <param name="FileName">읽어들일 파일 이름.</param>

    ''' <returns>읽어들인 Chunk값</returns>

    Public Function Chunk_ReadFile(FileName As StringAs List(Of Section)

        '읽기 전용으로 파일 스트림을 연다.

        Dim FS As New FileStream(FileName, FileMode.Open, FileAccess.Read)

        Dim Chunk = Chunk_ReadStream(FS)

        FS.Close()  '사용한 파일 스트림을 닫음

        Return Chunk

    End Function

 

    ''' <summary>스트림에서 Chunk를 읽는 함수.</summary>

    ''' <param name="Stream">읽어들일 스트림.</param>

    ''' <returns>읽어들인 Chunk값</returns>

    Public Function Chunk_ReadStream(Stream As StreamAs List(Of Section)

        '스트림 읽기에 관련된 함수가 있는 BinaryReader를 생성한다.

        Dim Reader As New BinaryReader(Stream)

        Dim Chunk As New List(Of Section)

        '스트림이 끝날때 까지 반복

        While Stream.Position < Stream.Length

            Dim Section As Section

            Dim Size As Integer

            '스트림에서 구휙의 이름을 읽어들임 (4바이트 문자열)

            Section.Name = Encoding.Default.GetString(Reader.ReadBytes(4))

            '스트림에서 구휙의 크기를 읽어들임 (4바이트 정수)

            Size = Reader.ReadInt32()

            '메모리를 사용하기 위해 MemoryStream을 생성한다.

            Section.Data = New MemoryStream()

            If Size > 0 Then '만일 크기가 0이하면 할당 할 수 없기 때문에 예외 처리

                '스트림에서 내용을 읽어서 작성한다.

                Section.Data.Write(Reader.ReadBytes(Size), 0, Size)

            Else

                '스트림을 Size만큼 이동시킨다.

                Stream.Position += Size

            End If

            '읽어들인 구휙을 리스트에 넣는다

            Chunk.Add(Section)

        End While

        '읽어들인 Chunk를 반환

        Return Chunk

    End Function

 

    ''' <summary>파일에 Chunk를 작성하는 함수.</summary>

    ''' <param name="Chunk">작성할 Chunk 내용.</param>

    ''' <param name="FileName">Chunk를 작성할 파일 경로.</param>

    Public Sub Chunk_WriteFile(Chunk As List(Of Section), FileName As String)

        '쓰기 전용으로 파일 스트림을 연다. (이어서 작성하기를 원하면 Append를 사용해도 된다)

        Dim FS As New FileStream(FileName, FileMode.Create, FileAccess.Write)

        Chunk_WriteStream(Chunk, FS)

        FS.Close()  '사용한 파일 스트림을 닫음

    End Sub

 

    ''' <summary>스트림에 Chunk를 작성하는 함수.</summary>

    ''' <param name="Chunk">작성할 Chunk 내용.</param>

    ''' <param name="Stream">Chunk를 작성할 스트림.</param>

    Public Sub Chunk_WriteStream(Chunk As List(Of Section), Stream As Stream)

        '스트림 작성에 관련된 함수가 있는 BinaryWriter를 생성한다.

        Dim Writer As New BinaryWriter(Stream, Encoding.ASCII)

        '각 섹션을 반복

        For Each Section In Chunk

            '스트림의 이름을 바이트 값으로 변환

            Dim Name = Encoding.Default.GetBytes(Section.Name)

            '스트림 이름이 4바이트가 아녈 경우를 위한 예외 처리

            If Not Name.Length = 4 Then Array.Resize(Of Byte)(Name, 4)

            '스트림에 구휙 이름을 작성

            Writer.Write(Name)

            '스트림에 구휙 크기를 작성 (스트림의 Length는 8바이트이므로 변환)

            Writer.Write(CInt(Section.Data.Length))

            '스트림에 구휙 내용을 작성

            Section.Data.WriteTo(Stream)

        Next

    End Sub

End Module

 

[Chunk의 읽기와 작성]


주석 덕분에 코드가 길어보이지만 실제로는 그리 길지 않다.

파일 또한 올려놓을테니 가져가서 원하는 대로 사용해도 좋다.

Chunk.vb




'Starcraft > scenario.chk' 카테고리의 다른 글

스타크래프트 chk의 구조  (1) 2016.12.16
posted by 자칭 프로그래머ㅡ ModMapper

파일 확장자로부터 아이콘 가져오기

Programming/Visual Basic 2016. 11. 23. 22:04


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
Imports Microsoft.Win32
 
''' <summary>확장자로부터 아이콘을 가져오는 모듈입니다.</summary>
Public Module IconModule
    'Win API
    Private Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As IntPtrByVal lpszExeFileName As StringByVal nIconIndex As IntegerAs Integer
    Private Declare Function DestroyIcon Lib "User32.dll" (hIcon As IntPtrAs Integer
 
    ''' <summary>확장자으로 부터 아이콘을 가져옵니다.</summary>
    ''' <param name="Ext">확장자 값 입니다.</param>
    ''' <returns>가져온 아이콘입니다. 실패시 Nothing(NULL)을 반환힙니다.</returns>
    Public Function GetIconFromExt(Ext As StringAs Icon
        Dim Reg = Registry.ClassesRoot, Icon As Icon
        Reg = Reg.OpenSubKey(Ext, False)
        If Reg Is Nothing Then Return Nothing
        Icon = GetDefaultIcon(Reg)
        If Icon IsNot Nothing Then Return Icon
        Icon = GetOpenIcon(Reg)
        Dim Value As String = Reg.GetValue(Nothing)
        If Value Is Nothing Then Return Nothing
        Return GetIconFromAppClass(Value)
    End Function
 
    ''' <summary>AppClass로 부터 아이콘을 가져옵니다.</summary>
    ''' <param name="AppClass">AppClass 스트링입니다.</param>
    ''' <returns>가져온 아이콘입니다. 실패시 Nothing(NULL)을 반환힙니다.</returns>
    Public Function GetIconFromAppClass(AppClass As StringAs Icon
        Dim Reg = Registry.ClassesRoot
        Reg = Reg.OpenSubKey(AppClass, False)
        If Reg Is Nothing Then Return Nothing
        Return If(GetDefaultIcon(Reg), GetOpenIcon(Reg))
    End Function
 
    Private Function GetDefaultIcon(Reg As RegistryKey) As Icon
        Reg = Reg.OpenSubKey("DefaultIcon")
        If Reg Is Nothing Then Return Nothing
        Dim Value As String = Reg.GetValue(Nothing)
        If Value Is Nothing Then Return Nothing
        Dim FilePath As String = ""
        Dim Index As Integer
        Try
            ParsePath(Value, FilePath, Index)
        Catch 'Parse Error
            Return Nothing
        End Try
        Return GetIcon(FilePath, Index)
    End Function
 
    Private Function GetOpenIcon(Reg As RegistryKey) As Icon
        Reg = Reg.OpenSubKey("shell/open/command")
        If Reg Is Nothing Then Return Nothing
        Dim Value As String = Reg.GetValue(Nothing)
        If Value Is Nothing Then Return Nothing
        If Value.Length = 0 Then Return Nothing
        Dim FilePath As String = ""
        Dim Spt As Integer
        If Value(0= """"Then
            Spt = Value.IndexOf(""""c)
            FilePath = If(Spt = -1, Value.Substring(1), Value.Substring(1, Spt - 1))
        Else
            Spt = Value.IndexOf(" ")
            If Spt = -1 Then Spt = Value.Length
            FilePath = Value.Substring(0, Spt)
        End If
        Try
            FilePath = IO.Path.GetFullPath(FilePath)
        Catch 'Parse Error
            Return Nothing
        End Try
        Return GetIcon(FilePath, 0)
    End Function
 
    ''' <summary>아이콘의 경로를 파싱하는 함수입니다.</summary>
    ''' <param name="Path">아이콘의 경로입니다.</param>
    ''' <param name="FilePath">반환되는 아이콘 파일의 경로입니다.</param>
    ''' <param name="Index">반환되는 아이콘의 인덱스입니다.</param>
    Private Sub ParsePath(Path As StringByRef FilePath As StringByRef Index As Integer)
        Dim Spt As Integer
        Path = Path.Trim(" "c)
        FilePath = ""
        Index = 0
        If Path.Length = 0 Then Return
        If Path(0= """"Then
            Spt = Path.IndexOf(""""c)
            If Spt = -1 Then
                Spt = Path.Length
                FilePath = Path.Substring(1)
            Else
                FilePath = Path.Substring(1, Spt - 1)
                Spt += 1
            End If
        Else
            Spt = Path.IndexOf(",")
            If Spt = -1 Then Spt = Path.Length
            FilePath = Path.Substring(0, Spt)
        End If
        If Spt = Path.Length Then Return
        Index = CInt(Path.Substring(Spt + 1))
        FilePath = IO.Path.GetFullPath(FilePath)
    End Sub
 
    ''' <summary>아이콘을 가져오는 함수입니다.</summary>
    ''' <param name="FilePath">아이콘 파일의 경로입니다.</param>
    ''' <param name="Index">아이콘의 인덱스입니다.</param>
    ''' <returns>가져온 아이콘입니다. 실패시 Nothing(NULL)을 반환힙니다.</returns>
    Private Function GetIcon(FilePath As String, Index As IntegerAs Icon
        Dim hIcon As IntPtr
        hIcon = ExtractIcon(0, FilePath, Index)
        If hIcon = 0 Then Return Nothing
        Dim eIcon = Icon.FromHandle(hIcon).Clone()
        Call DestroyIcon(hIcon)
        Return eIcon
    End Function
End Module
 
cs


사용법은 주석 참조


IconModule.vb


posted by 자칭 프로그래머ㅡ ModMapper

[SMLP] StarcraftMapLockerProject 프로텍터 Ver. 2.5.00

Project/StarcraftMapLockerProject 2016. 10. 28. 18:34
  • 이전 댓글 더보기
  • 존경하는 제작자님 안녕하신가요

    제작자님 덕분에 아직까지도 새로운 스타맵들이 꾸준히 나오고 있습니다.

    사실상 스타1이 꾸준히 유지될 수 있던건 님같은 분들의 노력이 있기 때문이라고 생각합니다.

    SMLP 감사히 잘 이용하고 있습니다.

    그런데 SMLP 2.0 버전이 런타임 오류가 떠서 사용을 못하고있습니다. 꼭 2.0버전 쓰고싶은데 어떻게 안될까요?

    존경하는 제작자님의 답변을 기다립니다.

    To. 제작자님 2017.05.11 00:04
  • 다른 컴퓨터에서는 실행되는데 이상하게 제가 쓰는 컴퓨터에서만 런타임 오류가 계속 뜨네요ㅠㅠ 무슨 프로그램이 필요한가요?

    storm.dll 이랑 SFmpq.dll 있는 폴더에 넣었습니다.

    To. 제작자님 2017.05.13 00:34
  • 윈도우10이에요

    To. 제작자님 2017.05.13 00:39
  • StarcraftMapLockerProject Error Log
    Send log to file Email : modmapper@tkyuki.kr
    ---Error Message---
    "Korean" 문자열에서 'Integer' 형식으로 변환할 수 없습니다.

    Source : Microsoft.VisualBasic
    Methood : Int32 ToInteger(System.String)

    위치: Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(String Value)
    위치: Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(Object Value)
    위치: StarcraftMapLockerProject.DeclareModule.LoadSettings()
    위치: StarcraftMapLockerProject.MainForm.MainForm_Load(Object sender, EventArgs e)
    위치: System.EventHandler.Invoke(Object sender, EventArgs e)
    위치: System.Windows.Forms.Form.OnLoad(EventArgs e)
    위치: System.Windows.Forms.Form.OnCreateControl()
    위치: System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
    위치: System.Windows.Forms.Control.CreateControl()
    위치: System.Windows.Forms.Control.WmShowWindow(Message& m)
    위치: System.Windows.Forms.Control.WndProc(Message& m)
    위치: System.Windows.Forms.ScrollableControl.WndProc(Message& m)
    위치: System.Windows.Forms.ContainerControl.WndProc(Message& m)
    위치: System.Windows.Forms.Form.WmShowWindow(Message& m)
    위치: System.Windows.Forms.Form.WndProc(Message& m)
    위치: System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    위치: System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    위치: System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

    이렇게 적힌 ErrorLog 메모장이 계속 생기네요... 어떡하죵 ㅠㅠ

    To. 제작자님 2017.05.13 03:33
  • 런타임 오류창이 계속떠서 설정 초기화를 못눌러요...

    To. 제작자님 2017.05.13 04:54
  • Runtime Error Detected! Retry? 창이 뜨고 다시시도랑 취소 두개가 있는데 다시시도 누르면 창이 계속뜨고 취소 누르면 프로그램이 꺼지네요
    어떡하죠 ㅠㅠ

    To. 제작자님 2017.05.13 16:44
  • 다시시도 게속 해서 설정 들어가서 초기화

    BlogIcon 자칭 프로그래머ㅡ ModMapper 2017.05.13 16:55 신고
  • 그게 안대용... ㅠㅠ

    To. 제작자님 2017.05.13 17:33
  • 게임시작하고 얼마안있어서 유저들 드랍되고 튕기고 겜멈추던데 이거때문인가요??

    ㅂㅈㄷㄱ 2017.05.14 17:00
  • 멀쩡하던 맵이 이걸로 프로텍트 하자마자 WAV오류 생기거나 렉이 걸리거나 하는 오류가 발생함.
    하여튼 wav 사용하면 이걸로 프로텍트 하면 안됨

    ㅇㅇ 2017.05.19 16:10
  • 리마스터에서 작동하지 않네요 ㅠ

    패치예정 있나요?

    ㅠㅠ 2017.07.31 20:42
  • 새로운 패치 기대하겠습니다!!!
    또 들어올게요~

    부탁 2017.08.15 14:34
  • 리마스터 1.20 에 맞는 새로운 프로텍터 부탁드립니다 정말잘쓰고있습니다.

    요청합니다 2017.08.18 02:31
  • 오늘 갑자기 프로텍터 튕김과 동시에 파일이 강제로 삭제 당했어요,
    방화벽 때문인가해서 전부 해제 시키고 다운받아보았는데도 다운로드 자체를 컴퓨터에서 막아버림 ㄷㄷ;
    2.4 이하 의 버젼부터는 실행 자체가 안되구요;;

    갑자기 왜이러지 ㄷ

    executer10 2017.08.31 22:06
  • 방법은 없나요? ㅠㅠ

    executer10 2017.09.01 12:33
  • 고급옵션에서 EUD지원과 EUD보호 1.16.1 상관관계를 알수있을까요? 그리고 CHK프로텍션과 좌측 chk 클릭후 암호화 체크 관련두요

    grp와 datedit 언리미터만 사용중인데 맵내부에서 버그가 일어나네요 다만 같은위치가 아니라 무작위로 일어나는거보니

    프로텍션쪽에서 잘못됏나싶어서요 1.16버전만 사용합니다 답변부탁드려요

    집정관 2017.09.03 13:59
  • 그러면 chk 프로텍션으로 인해서 맵버그가 일어나는 경우가 있나요?? 체크가 두개가있더라구요 chk 프로텍션하고 시나리오.chk 클릭후 암호화 체크옵션요

    현재 사용하는 체크옵션이 mpq 프로텍션, chk 프로텍션 EUD지원, EUD보호 1.16.1 그리고 좌측 시나리오.chk 에서 암호화 해제상태이고 wav이름은 바꾸지 않음 이거든요(datedit(6개 간단한 무기속성만바꿈), grp(4개), 언리미터 사용중)

    집정관 2017.09.03 15:40
  • 안녕하세요. 프로텍터 잘 쓰고 있습니다. 한가지 문제가 있어서 댓글 달아요.
    얼마전에 리마스터 패치에서 유닛확장 목록이 생겼는데 이 프로텍터로 보호하면 유닛확장이 안되는 현상이 발생되네요.
    보호하기전 파일은 잘 적용되구요. 그래서 어쩔수 없이 chk 보호는 해제하고 mpq만 프로텍트를 하는데 금방 뚫린다는게 문제네요.

    문의 2018.01.28 16:52
  • OGG 파일로 사운드를 넣을 시 기본 압축재생때문에 사운드가 전혀 재생되질 않습니다 OGG 지원도 가능하게 해주실 수 있나요

    OGG문의 2019.02.23 20:44
  • 이프로텍터 뚫을려면 헥스빼고는 방법없나요?

    wwwwww 2019.05.12 19:21


<성능>

An Unprotector 0.06

Starcraft Map Cracker 2.88

Unused Unprotector 2 Final

를 포함한 언프로텍터 방어


<설명>

이름 : StarcraftMapLockerProject Ver. 2.5.00

제작자 : ModMapper

블로그 : http://blog.tkyuki.kr/

이메일 : modmapper@tkyuki.kr


<업데이트 기록>

프로텍션 강화

EUD 추가 지원

MPQ 라이브러리 업데이트


<태그>

일단은 EUD 프로텍션의 버그를 수정했습니다 그리고 EUD 지원을 강화해서

다른 EUD 유틸리티를 대부분 지원합니다 (EUDPLIB 등 그 외 기타)


음... 프로텍션이 약간 부족해네요 으... 추가 할만한게 잘 안보여요...

이제 다 만들었으니 오버워치나 다른 게임이나 해야지...


2016 - 11 / 09

- 버그 수정


2017 - 3 / 30

- 1.18 호환성 패치

- 일부 버그 수정

- MPQ 프로텍션 수정


2017 - 4 / 07

- 1.18 호환성 패치


2017 - 12 / 10

- 스타크래프트 지원에 따른 구버전 파일로 롤백


StarcraftMapLockerProject.exe


posted by 자칭 프로그래머ㅡ ModMapper