2011-12-19 5 views
1

나는 이것을 알아 내려고 많은 시간을 보냈다. 그래서 나는 여기서 도움을 얻을 수 있다고 생각했다.C++/C에서이 DLL 함수를 호출하는 방법

[id(1), helpstring("method findFile")] HRESULT findFile(
    [in] BSTR fileName, 
    [out] LONG* someValue 
    ); 

가 정확히 어떻게 내가 선언하고 C++/C#을 하나에서 호출을 수행합니다 는 기본적으로 나는 IDL에 다음과 같이 선언 된 DLL 기능이?

참고 :이 기능을 성공적으로 호출하는 VB6 앱이 있습니다. 선언은 다음과 같습니다

Private Declare Function findFile Lib "thedll.dll" (_ 
    ByVal fileName As String, _ 
    ByRef someValueAs Long _ 
) 

호출 :

Dim a As String 
Dim b As Long 
Dim r As long 

a = "image.jpg" 
b = -1 
r = findFile(a, b) 

부록는 :

내가 실행 파일을 가지고 있기 때문에 VB6 코드가 같다고 보장 할 수 없습니다, 나는 무엇을 그에게 말했다 만했다 부분이 비슷해 보이므로 여러분이 옳고 일치하지 않을 수 있습니다. 나는 C++ DLL을 저작했고, 이제는 물건을 시험해보고 그 exe에 의존하지 않기 위해 DLL을 성공적으로 호출하는 코드를 함께 모을 필요가있다. DLL 함수의

C++ 구현은 다음과 같습니다

STDMETHODIMP CFinder::findFile(BSTR fileName, LONG* someValue) 
{ 
    *someValue = 8; 

    return S_OK; 
} 
+0

나는 다소 회의적인 존재하고있다. 이 함수를 선언하면 (TLB 파일을 사용하는 것과 반대), 1)'fileName'이 잘못된 방식으로 정렬 될 것이기 때문에 실패 할 것입니다. 2)'Variant'의 반환 값은 스택의 불균형을 일으킬 것입니다 ('Long '). – GSerg

+0

함수를 선언하는 C++ 소스 코드를 보여주십시오. –

+0

있습니다. 나는 ATL을 사용했다. –

답변

1

테스트되지 않은 C#을 선언 :

[DllImport("thedll.dll", SetLastError=true)] 
static extern int findFile([MarshalAs(UnmanagedType.BStr)]string fileName, out int someValue); 
+0

'out int someValue' – GSerg

+0

감사합니다. –

+0

OK ...이 함수 호출에서 : "보호 된 메모리를 읽거나 쓰려고 시도했습니다. 이것은 종종 다른 메모리가 손상되었다는 표시입니다." 나는이 시점에서 모든 단서를 얻었습니까? –

관련 문제