반응형

Github에서 FormUpload 소스를 사용하다가 동일한 키값으로 파일을 동시 전송해야하는데 해당기능이 개발되지 않아서 소스를 뜯어 고쳐 보았다.

사용법은 아래와 같다.

FormUpload multiForm = new FormUpload();
multiForm.Key = "AES 32자리 키값";
multiForm.AddStringParam(false, "stringdatakey", "value"); //AddStringParam()의 첫번째 매개변수는 AES암호화 여부
multiForm.AddFileParam(fasle, "files", FilePath); //files키값의 파일 첨부 (같은키값 사용가능)
Dictionary<string, string> jsonResult = multiForm.SendPage(ipaddress); //json형식 데이터를 리턴
string result = jsonResult.ContainsKey("Data") ? jsonResult["Data"] : ""; //Data라는 키값의 데이터가 존재할때 result값에 해당값 대입

같은 키값이 되도록 수정한 부분은 2중 foreach문을 사용하여 list에 저장된 값이 전송되도록 하였다.

FormUpload 클래스만 사용하면 Post통신할때 아주 간편해졌다.

FormUpload.cs
0.02MB
AES.cs
0.01MB

 

반응형

'개발언어 > C#' 카테고리의 다른 글

C# OCX DLL 못찾는 오류  (0) 2020.12.03
c# TCP 파일 전송 프로그램  (1) 2020.02.28
c# 영상처리 중 렉걸릴 때  (0) 2020.02.26
SetupApiDll.dll dll 못 찾는 오류  (0) 2020.02.26
OpenCvSharp 셋업 프로젝트 오류  (0) 2020.02.12
반응형

잘되던 프로그램이 갑자기 "클래스가 등록되지 않았습니다. (예외가 발생한 HRESULT: 0x80040154..." 라는 오류와 함께 실행이 되지 않았다.

프로젝트내 참조를 확인해보니 OCX dll들이 노란빛의 느낌표가 있던것을 확인하였다.

2~3일동안 별짓을 다하다가 결국 해결방안을 찾았다.

프로젝트 참조에 에러표시가 있던 dll들을 삭제시킨 후 OCX를 C:\Windows\SysWOW64 폴더에 넣고

콘솔(cmd)을 관리자 권한으로 실행하여 regsvr32명령으로 해당 OCX를 레지스트리에 등록 해준다.

다음으로 Visual Studio에서

디자이너 모드 -> 도구 상자 -> 우클릭 -> 항목선택 -> COM -> 해당 OCX를 찾아서 선택하고

컨트롤을 디자이너 아무곳이나 추가하게 되면 참조에 자동으로 C#에서 사용가능한 DLL(Ax...)로 변환되어 사용 가능하게 되었다.

반응형

'개발언어 > C#' 카테고리의 다른 글

C# Http 파일 전송  (0) 2020.12.04
c# TCP 파일 전송 프로그램  (1) 2020.02.28
c# 영상처리 중 렉걸릴 때  (0) 2020.02.26
SetupApiDll.dll dll 못 찾는 오류  (0) 2020.02.26
OpenCvSharp 셋업 프로젝트 오류  (0) 2020.02.12
반응형

주요 소스 정리

Tcp 소켓 오픈 소스

private void TcpSocketOpen()
        {
            try
            {
                receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 2020);          //2020포트의 서버를 연다.
                receiveSocket.Bind(endPoint);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

Tcp 소켓 연결 소스

private void TcpSocketConnect()
        {
            if (conCheck) return; //연결 되어 있으면 재연결 안함
            try
            {
                sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                sendSocket.Connect(IPAddress.Parse(textBox1.Text), 2020);  //2020포트의 서버에 연결
                //sendSocket.ReceiveTimeout = 5000;
                conCheck = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                button2.Enabled = false;
            }
        }

Tcp 소켓 수신 대기 소스

private void Listen()
        {
            if (listenCheck) return;  //연결 되어 있으면 재연결 안함
            try
            {
                receiveSocket.Listen(20);
                receiveSocket = receiveSocket.Accept();

                listenThread = new Thread(Receive_Data);   //실제 통신을 담당하는 쓰레드 생성
                listenThread.Start();
                listenCheck = true;
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
                button3.Enabled = true;
                if(listenCheck)
                    listenCheck = false;
            }
        }

RTP헤더는 추가하지 않았고

파일 이름 사이즈, 파일 이름, 파일 크기 <- 헤더로 사용하고

파일 내용물이 맨 뒤에 붙게 만들었다.

클라이언트 하나로 송수신이 가능하게 만들었고 같은 네트워크 대역대에 있는 컴퓨터만 연결 가능하다.

서버를 사용하면 데몬을 통해 송수신하면 될 것 같다.

FileTranfer.zip
0.22MB

내가 직접 만든거라 바이러스는 절대 없음.

반응형

'개발언어 > C#' 카테고리의 다른 글

C# Http 파일 전송  (0) 2020.12.04
C# OCX DLL 못찾는 오류  (0) 2020.12.03
c# 영상처리 중 렉걸릴 때  (0) 2020.02.26
SetupApiDll.dll dll 못 찾는 오류  (0) 2020.02.26
OpenCvSharp 셋업 프로젝트 오류  (0) 2020.02.12
반응형

OpenCvSharp을 타이머를 사용하여 PictureBoxIpI에 영상 출력을 하는 프로그램을 작성한 뒤

 

얼마안되서 영상이 멈추었다가 10초 정도 뒤에 다시 동작하는 현상이 발생하였다.

 

해당 현상을 해결하기 위해 메모리 너무 잡아먹지는 않는지..

 

CPU를 많이 사용하는지 확인하였지만 둘다 크게 상관이 없었다.

 

혹시나 해서 Gabage Collection을 사용하여 쓰레기 값을 수집하니... 멈춤현상이 생기지 않았다.

 

GC.Collect();
GC.WaitForPendingFinalizers();

 

이 두줄을 타이머가 돌아가는 Tick이벤트에 추가하여 해결하였다.

반응형

'개발언어 > C#' 카테고리의 다른 글

C# OCX DLL 못찾는 오류  (0) 2020.12.03
c# TCP 파일 전송 프로그램  (1) 2020.02.28
SetupApiDll.dll dll 못 찾는 오류  (0) 2020.02.26
OpenCvSharp 셋업 프로젝트 오류  (0) 2020.02.12
c# 쓰레드로 폼제어  (0) 2019.07.10
반응형
	/// <summary>
        /// 외부에서 장치들의 상태를 알아오는 함수를 호출 할 수 있는 모듈
        /// </summary>
        /// <param name="str"></param>
        /// <param name="len"></param>
        [DllImport("SetupApiDll.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        private static extern void GetDeviceInfo(StringBuilder str, int len);

        /// <summary>
        /// 장치들의 상태를 알아온다.
        /// </summary>
        /// <returns>장치들의 상태를 문자열로 돌려준다.</returns>
        public string GetDeviceState()
        {
            StringBuilder buffer = new StringBuilder(255);
            GetDeviceInfo(buffer, buffer.Capacity);
            return buffer.ToString();
        }

장치 정보가져오는 dll을 DllImport할 때 빌드한 컴퓨터에서는 동작이 잘되었지만

다른 컴퓨터에서 실행하니 dll을 찾을 수 없다는 오류가 발생하였다.

확인해보니 해당 dll을 참조하는 dll을 추가해 주어야 정상 동작하였다.

msvcpr100d.zip
0.74MB

설치 프로젝트를 만들 때 해당 dll들을 포함시켜 빌드하여 오류를 해결하였다. (zip파일 바이러스 검사하였음)

 

-------- 윈도우 시스템 폴더에 포함시켜도 동작하였다 ------

win 32bit 일 경우 C:\Windows\system32 폴더안에 복사

win 64bit 일 경우 C:\Windows\syswow64 폴더안에 복사

 

참고로 아래 사이트에서 무료로 특정 dll이 참조하는 다른 dll을 찾아주는 프로그램도 있다.

http://www.dependencywalker.com/

 

Dependency Walker (depends.exe) Home Page

Dependency Walker is a free utility that scans any 32-bit or 64-bit Windows module (exe, dll, ocx, sys, etc.) and builds a hierarchical tree diagram of all dependent modules. For each module found, it lists all the functions that are exported by that modul

www.dependencywalker.com

노란색 ? 동그라미로 표시된 dll이 없는 dll이라는 것을 알 수 있다.

반응형
반응형

카메라 출력에 EmguCv를 사용하였다가 밝기 조절 하는 기능이 적용되는 컴퓨터와 그렇지 않은 컴퓨터가 있었고,

 

DirectShow로 카메라 정보를 가져올 때 인덱스 0번을 가져오면 EmguCv 객체에서는 1번을 가져와서 2대 이상의 카메라에는 혼돈이 생겼다.

 

그래서 OpenCvSharp으로 Dll를 급변경 하였고, Debug빌드 테스트 문제가 없어 바로 Setup프로젝트로 만들고 설치 후 실행하였지만 카메라 출력시 오류가 발생해 프로그램이 종료되는 문제가 발생했다.

 

오류를 출력한 결과 OpenCvsharp.Mat의 형식 이니셜라이저에서 예외를 Throw했습니다. 라는 문구를 확인하였고, 

Nuget에서 설치시 패키지에 들어있던 runtimes\win-x86\native 폴더에 있는 OpenCvSharpExtern.dll을

Setup프로젝트에 포함시켜 빌드하니 잘 동작하였다.

 

OpenCvSharp은 이문제만 해결하면 DirectShow와 객체생성할때 쓰는 인덱스와 일치하고, Camera.Brightness 에 값만 대입해주면 밝기 조절도 가능하였다.

 

EmguCv를 여태까지 잘 써왔지만 많이 부족한 것 같다.

그래도 지금도 계속 업데이트 중이니 확인을 계속 해야겠다.

반응형
반응형

메인 쓰레드가 아닌 새로운 쓰레드로 폼과 컨트롤들을 제어하려고 하면 크로스 쓰레드 에러가 발생한다.

InvokeRequired로 현재 쓰레드가 메인쓰레드와 충돌이 되는지 확인하고 Invoke()메서드로 대리자를 생성해준다.

 

필자의 경우는 폼을 Hide()메서드를 사용해 잠시 숨겼다가 쓰레드로 Show()메서드를 사용할 때

에러가 발생하여 처리한 경우이다. 닷넷 버전이 올라가면서 this는 안써줘도 됨으로 생략하였다.

 

InvokeRequired는 주로 텍스트 박스같은 컨트롤에도 사용할 수 있다.

텍스트 박스같은 경우는 주로 채팅프로그램에서 쓰레드를 써야할때 쓰므로 아주 유용하다.

ex) if (textbox1.InvokeRequird) textbox1.Invoke(new ...

if (InvokeRequired) //만든 쓰레드가 메인 쓰레드와 충돌할때
{
	Invoke(new MethodInvoker(delegate ()
	{
		Show();
	}));
}

else
{
	Show();
}
반응형
반응형

이미지를 메모리스트림에 넣었다가 ToArray() 메서드를 사용해 바이트 배열로 만든다.

가운데 using을 쓴 이유는 메모리 스트림 객체는 생성하고 리소스 할당 해제를 Dispose() 메서드로 해주는데, using을 쓰면 중괄호 블럭에서 벗어나면 자동으로 할당 해제가 된다.

public static byte[] ImageToByteArray(Image image) //이미지를 바이트배열 변환
{
	using (var ms = new MemoryStream())
	{
		image.Save(ms, ImageFormat.Jpeg);
		return ms.ToArray();
	}
}

private Bitmap byteArrayToImage(byte[] imgbytes) //바이트를 이미지배열로 변환
{
	using (var ms = new MemoryStream(imgbytes))
	{
		Bitmap img = Image.FromStream(ms) as Bitmap;
		return img;
	}
}
반응형

'개발언어 > C#' 카테고리의 다른 글

OpenCvSharp 셋업 프로젝트 오류  (0) 2020.02.12
c# 쓰레드로 폼제어  (0) 2019.07.10
c# 마우스 드래그로 폼이동하기  (0) 2019.07.10
c# Form에서 ALT+F4 막기  (0) 2019.07.10
c# 폴더(디렉토리) 생성 후 삭제하기  (0) 2019.06.28

+ Recent posts