Guestbook
Leave your greetings here.
-
석원
2009/04/30 16:04
Modify/Delete
Reply
Address
석원이다.
전화번호 바꿨으면 연락을 해야지...
씨땡.~!!
문자 남겨라.
010-7554-3909 -
궁금이
2009/02/17 17:47
Modify/Delete
Reply
Address
ATL 로 만든 COM 에 문자열 전달하기! C#에서 어떻게 하나요?
pyobegy@nate.com
자.. 무엇이 문제인지 시작해보겠습니다.
ATL 로 만든 COM 에 문자열 전달하기! C#에서 어떻게 하나요?
C# 서버부분입니다. 테스트용이고요, 컴포넌트를 사용하고 싶은게 목적입니다.
당연, 참조추가로, ATL 로 작성한 COM 의 tlb 파일을추가했고, HiServerComLib 가 추가되었습니다.
HiServerComLib.HiServerComClass Master = new HiServerComLib.HiServerComClass(); 이렇게, Master 포인터를 얻었고,
Master.FtpConnect(); 컴포넌트 함수에 아무런 인자가 전달되지 않는 함수의 호출은 아주 순조롭게 잘 호출이 됩니다.
하지만, ATL COM 에서 STDMETHOD(UpdateLog)(CHAR * AllPath, LONG * Result); 이렇게 매소드를 추가했는데,
추가할때, 인자를 설정하는 부분에서 in 형으로 CHAR * 를, out 형으로 LONG * 를 지정하였습니다.
분명, C++ 같은 과정으로 컴포넌트를 호출하면 잘 호출 됩니다. (소스코드는 아래쪽에 붙였습니다.)
그런데...
C# 에서는 에러가 발생합니다.
Master.UpdateLog("./Data/Facility/Wall/Module/DER123.jpg"
;
이렇게 사용하니, 안되는군요. 에러메시지는
오류 CS1502: 'HiServerComLib.IHiServerComClass.UpdateLog(ref sbyte)'에 가장 일치하는 오버로드된 메서드에 잘못된 인수가 있습니다.
오류 CS1503: '1' 인수: 'string'에서 'ref sbyte'(으)로 변환할 수 없습니다.
인자로 전달해야하는 자료형은 분명, CHAR * 라고 생각했는데, C#에서는 이런 자료형이 없는건지, 인식이 다른 방식으로 되는 것인지 알도리가 없네요. ref 참조형으로, sbyte 를 전달하라고 하는 것 같은데,
sbyte 는 1바이트 크기더라구요, singed byte -128~127 까지..
완전 답이 없죠.. 문자열을 전달해야하는데... 1바이트라니..
어떤방법을 써서 전달해야하는지, 아니면 ATL로 입력 자료형을 다른걸로 줘야하는지,,,,,
ATL 에서는 입력자료형에 제약이 있어서 그나마 문자열을 전달하기 위해 선택한것이 CHAR * 입니다.
이제 소스코드를 읽어주세요 ㅠㅠ
using System;
using System.Collections.Generic;
using System.Text;
using HiServerComLib;
namespace HiServerByCSharp
{
class Program
{
static void Main(string[] args)
{
HiServerComLib.HiServerComClass Master = new HiServerComLib.HiServerComClass();
Master.FtpConnect();
Master.UpdateLog(ref string a);
//Master.UpdateLog("./Data/Facility/Wall/Module/DER123.jpg"
;
// ATL 로 COM 컴포넌트를 만들어 매쏘드이름을 FtpConnect(), UpdateLog() 로 만들었고,
// 선언은 다음와 같습니다.
// 두 함수 모두 LONG * 는 Out returnValue로 쓰기 때문에 신경을 쓰지 않습니다.
// STDMETHOD(FtpConnect)(LONG* result);
// STDMETHOD(UpdateLog)(CHAR * AllPath, LONG * Result);
// UpdateLog 함수가 문제입니다.
// ATL 에서 정말 답답하게도, CString 이 전달이 안되더군요, 그래도 CHAR *로도 별문제없이, C++ 코드에서는 문자열 넘기면 잘 받아줍니다.
// 문제는, C# 에서 문자열을 던질려니까 (Master.UpdateLog("./Data/Facility/Wall/Module/DER123.jpg"
; 이렇게..)
// 오류 CS1503: '1' 인수: 'string'에서 'ref sbyte'(으)로 변환할 수 없습니다. 라는 에러가 뜨는군요..
// 당연히, C++ 코드에서 문자열 넘겨서 잘 넘어가길래, C#에서도 문자열 넘기면 될줄 알았는데...
// 아니되는군요..
// 어떻게 이 난관을 해쳐나가야할지 모르겠습니다.
}
}
}
참고로, ATL 에서 COM을 만들어 C++ 에서 활용하는 소스입니다. 당연 잘돌아갑니다..
#include "stdafx.h"
#include "../../HiServerCom/HiServerCom/HiServerCom.h"
#import "../../HiServerCom/HiServerCom/Debug/HiServerCom.dll"
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
HiServerComLib::IHiServerComClassPtr Master(__uuidof(HiServerComLib::HiServerComClass));
Master->FtpConnect();
Master->UpdateLog("./Data/Facility/Wall/Module/DER123.jpg"
;
// 문자열던져도 아주 잘돌아가죠~
// C# 에서는 어떻게 해야될까요? 제발 도와주세요!!
return 1000;
}-
나는산
2009/02/17 20:47
Modify/Delete
Address
.NET 프레임워크 클래스 라이브러리에 변환 함수를 사용하면 되지 않을 까요?
Convert.ToSByte(String)
링크 : http://msdn.microsoft.com/en-us/library/b0hdkwd9.aspx
-
-
로미
2008/08/13 02:32
Modify/Delete
Reply
Address
기껏 들려서 ㅋㅋ 영화랑 일드리플만 달아놨네여 ㅋㅋ
영화 검색하다가 오빠가 비슷한 취향이라고 이야기 한거 생각나서
함들려봤어여 ㅋㅋㅋ 아... 배고프다 ㅠ,ㅠ
오빠 건강한 일주일 되시구영~~~
그럼 다음에 또 들릴께요-
나는산
2008/08/13 09:38
Modify/Delete
Address
ㅋㅋ 고맙다. 너도 건강한 한 주 되고~ 다음에도 기대 할껭.
-
-
홍성배
2008/08/01 17:51
Modify/Delete
Reply
Address
준희 잘 살고 있어?
열심히 살고 있겠지..
냉장고에 맥주좀 쟁여놓구 연락해...
놀러가께-
나는산
2008/08/04 09:50
Modify/Delete
Address
옙. 맥주 챙겨놓고 연락드리겠습니다.
-
-
봄
2008/04/11 18:09
Modify/Delete
Reply
Address
저도 궁금해서 들려봤어요.ㅋ
오늘 바람이 너므 좋아요.
우체국 핑계로 나가 별다방 커피한잔 들고오다가 삐긋해 쏟아버렸다는..ㅠ.ㅜ
좀있음 퇴근하겠내여..^^
홈피 잘 보고가요^^-
나는산
2008/04/21 11:20
Modify/Delete
Address
ㅎㅎ 와서 고마웡~
-
-
상준
2008/03/26 19:14
Modify/Delete
Reply
Address
잘 살고 있냥?
걍 궁금해서 들려 봤뜸-
나는산
2008/03/28 11:10
Modify/Delete
Address
그냥 일에 파묻어 살고 있음.
인제 와이프 만삭이겠네~ ㅋㅋ
-
-
yjheon
2007/08/13 17:05
Modify/Delete
Reply
Address
xbap질문 추가사항 입니다.
------------------------
먼저, 관심을 갖아주셔셔 고맙습니다.
흐름은 아래와 같읍니다.
1. 메인Page(=기동시 start되는 것)에 Grid로 구역을 나누어서 여기에 몇개의Dockpanel을 지정해놓고, 마치 Frame처럼 사용하려함.
2. 필요에따라 다른 Dockpanel로 바꾸기위해(navigation처럼)
app.xalm.cs에서 Hashtable을 생성하여 Application..properties에 설정해놓음.
경우에따라서는 다른 Dockpanel의 cs에서도 사용해야하므로.
3. W0031은 Dockpanel임.
4. x_DpnWr0c0는 메인Page에있는 Dockpanel의 이름임.
5. 소스를 수정하여 new W0031한것을 x_DpnWr0c0에 연결(화면표시상 덮어져보임)하는 부분만 해보았는데, 이것에는 error가 안남.
error가 나는 부분은 Application..객체에서 다른 객체를 꺼내올때, 이놈을 인식못하는 듯함.
이것이 WPF Appl로는 하자가 없었는데요.
혹, 필요하면 관련 소스를 멜로 보내드리겠읍니다.
그리고, 추가로 필요한게 있으면 멜로 알려주세요.
멜: yjheon@itopsystem.co.kr
-끝--
나는산
2007/08/20 12:50
Modify/Delete
Address
메일 잘 받았고요. 다시 메일 드렸습니다.
-
-
yjheon
2007/08/07 18:26
Modify/Delete
Reply
Address
xbap에서 질문입니다. 2가지경우.
---------------------
W0031 cwin;
cwin = new W0031();
1) DockPanel dpnWk = (DockPanel) (Application.Current.MainWindow.FindName("x_DpnWr0c0"
);
dpnWk.Children.Add(cwin);
2)y_myHash = (Hashtable)Application.Current.Properties["y_myHash"];
String y_hashKey;
y_hashKey = "3^" + "W0031";
y_myHash[y_hashKey] = cwin;
위의 code는 WPF Appl에서는 잘 실행되는 건데,
XBAP으로 실행하면
'dpnWk.Children.Add(cwin);'과
'y_myHash[y_hashKey] = cwin;'에서
dpnWk와'y_myHash가 NullreferenceException이 납니다.
이것이 어떤 이유인지 아시면 답 부탁합니다.
'y_myHash는 App.xaml.cs에서 미리생성한 hashtable입니다.
-
나는산
2007/08/08 13:05
Modify/Delete
Address
이걸로 정확하게 모르겠네요.
혹시 더 자세히 알려줄수 있나요?
W0031은 어떤 클래스인가요? 윈도우 인가요?
혹시 Window이면 XBAP에는 Window를 지원하지 않습니다. Page로 변경해야할 것입니다.
-
-
김미정
2007/07/24 21:47
Modify/Delete
Reply
Address
오빠 오랜만에 들렸더니 분위기가 남다른걸요? ㅋㅋ
잘지내고 계시죠? 날씨가 넘 더워요..ㅠ,ㅠ
^-^ 더위에 살좀 빠지셨나요? 전 쪘어요.ㅠㅠ
아~~~~지친다.ㅠ,ㅠ-
나는산
2007/08/01 18:46
Modify/Delete
Address
ㅋㅋ 정말 오랫만이네... ^^ 한번봐야하는디~~
좋은 소식이 들려오던데...
-

