2009-03-10 3 views
1

문자열을 반환하는 함수가있는 세 번째 파트 dll이 있습니다. 함수를 호출하면 예를 들어 "123456"이 반환됩니다. 적어도 그거 같아.하지만 내가 이상한 짓을 할 때. 길이는 길이를 반환하지 않는다. 레이블의 텍스트 속성을 설정하면 "123456"이 표시됩니다.dll이 문자열을 올바르게 반환하지 않을 때 수행 할 작업

내가 DLL에서받은 문자열이있을 때 나는 웹 서비스 기능에 보내

rem call dll and get string 
dim mystring as string=mydll.getstring() 

rem Send it to the webservice 
webservice.SaveString(mystring) 

내가로부터받은 문자열을 발송 webexeption ("protocoll 오류")가있는 웹 서비스 충돌을 DLL. 대신 다음과 같이 보내면 :

rem call dll and get string 
dim mystring as string=mydll.getstring() 

rem Send it to the webservice 
dim FixedString as string = mid(mystring,1,6) 
webservice.SaveString(mystring) 

그런 다음 제대로 작동합니다. 그게 내가 DLL에서 얻은 문자열이 어딘가에 제대로 종료되지 않았다고 생각하게 만든다. 그리고 나는 vb.net에서 수정하는 방법을 모른다. (나는 DLL을 바꿀 수 없다.) 그리고 나는 미리 문자열이 얼마나 길어야할지 모른다.

dll은 특정 하드웨어가 연결되어있을 때만 사이트에서 작동하므로 개발자 전용 환경에서이 문제를 해결하기 위해 사무실에 앉아있을 수 없습니다. 그래서 고객에게 다시 가기 전에 가능한 해결책을 찾고 싶습니다.

편집 1 : 나는 (I 실제 길이를 잘 모릅니다 때문에) 1부터 100까지 루프 및 <> ""새 변수에 있지만 일부러 모든 문자를 복사하려고 루프를 다만 시도 작업. 그 날이 끝나고 고객 사이트를 떠나야했기 때문에 나는 다른 변종을 시도하지 않았다.

편집 2 :
DLL을 임 VB6에서 만든 이야기. 그 DLL은 C++로 만들어진 다른 DLL과 이야기하고 있습니다 (제 생각 엔).

내 프로그램 < -> VB6 - DLL < -> C++ - DLL < -> 하드웨어

+0

당신은 그 미스터리를 무엇을 의미합니까? 길이는 길이를 반환하지 않습니까? 그것은 정수를 반환합니다 - 어떤 정수가 반환 되었습니까? 0? –

+0

정말 신비 롭습니다. webservice를 호출하기 전에 msgbox (mystring & ":"& mystring.length)를 수행했으며 msgbox에는 "123456 :"이 표시되고 이후에는 아무것도 표시되지 않았습니다. 어느 쪽도 그것에 관한 충돌을 didnt한다. – Stefan

답변

1

체크 아웃 문자열에 대한 MSDN documentation, 대한, 특히 부분 : .NET Framework의

, String 객체는 문자열의 길이의 한 부분으로 간주 임베디드 널 (null)을 포함 할 수 있습니다. 그러나 C 및 C++와 같은 일부 언어에서 null 문자는 문자열의 끝을 나타내며 문자열의 일부로 간주되지 않으며 문자열의 길이의 일부로 간주되지 않습니다.즉, C 및 C++ 프로그래머 또는 C 또는 C++로 작성된 라이브러리가 문자열에 대해 문자열을 만들 수 있다고 가정하는 일반적인 가정은 다음과 같습니다.

strlen 또는 wcslen 함수에서 반환 된 값은 반드시 등가 String.Length.

strcpy_s 또는 wcscpy_s 함수로 만든 문자열이 String.Copy 메서드로 만든 문자열과 반드시 ​​동일하지는 않습니다.

문자열 개체를 인스턴스화하는 네이티브 C 및 C++ 코드와 플랫폼 호출을 통해 String 개체에 전달되는 코드는 포함 된 null이 문자열의 끝을 표시한다고 가정하지 마십시오.

rem call dll and get string 
dim mystring as string=string.intern(mydll.getstring()) 

:

대신 내가 좋아하는 뭔가를 할 거라고 (참고 :이 시도하지 않은) VB6에서

+0

고마움, 아픈 내일 그것을보십시오. – Stefan

0

하나의 가능성은 바이트 배열로 변환하고 배열의 크기를 얻을 수있을 것이다.

0

문자열은 .NET, BTW에서 Null 종료되지 않습니다.

위의 대답에 동의합니다. 또한 바이트로 변환하고 바이트를 봅니다.

타사가 유효한 문자열을 반환 할 수없는 경우에도 프로그램을 크래시하지 않기 위해 의존 할 수 없습니다. 이것은 관리되는 DLL입니까, 아니면 비 관리 코드입니까? 프로그램이 다중 스레드인가, 그렇다면이 타사 비 관리 DLL이 다중 스레드 환경에서 작동합니까? 어떤 경우에는 해당 DLL에 대한 모든 액세스를 직렬화해야 할 수도 있습니다.

+0

Im이 DLL은 VB6에서 만들어졌으며 com-dll입니다. – Stefan

+0

내 프로그램이 다중 스레드되지 않습니다. 그리고 저자가 내 문제를 고칠 수 없다면이 문제를 해결할 수 있습니다. – Stefan

0

문자열은 BSTR에 (this 또는 Google for more 참조)이다.

BSTRs는 null로 끝나지는 않지만 길이가 모두 정수로 시작됩니다. 따라서 정수와 Unicode 문자의 배열을 포함하는 메모리 블록에 대한 포인터가 있으며이 포인터는 문자열을 가리 킵니다. 그러나 정수를 저장하는 4 바이트의 정수가 있습니다. 길이에 직접 접근해서는 안되며 대신 SysStringLen() (Win32 함수)을 호출하여 이러한 문자열의 길이를 가져와야합니다.

관련 문제