VBA에서 일부 오래된 VB 함수를로드하고 대부분 VB.NET으로 업데이트되었지만 제대로 일치하지 않는 "wininet.dll"함수의 함수 선언이 있습니다.어떻게 관리되지 않는 dll에 대한 올바른 인수 구조를 알아낼 수 있습니까?
내가 갖는 오류 : 슬로우
예외 : 관리 디버깅 도우미 'PInvokeStackImbalance'...
길고 그 짧은은 그 길이 선언 된 인수는 명시 적이어야하며 dll의 실제 함수와 일치하지 않습니다.
나는 이것들을 보았고, 수표를 제거하는 것만으로 얻을 수 있었지만, "스택 불균형"이 생겨 결국이 콜이 만들어지면서 모든 스택을 먹었다. 또한 이러한 것을 "관리되지 않는"dll이라고하며 일부 선언은 PInvoke 함수 위키 http://pinvoke.net에 있습니다. 이 위키는 내가 사용하고있는 함수 호출 중 일부를 가지고 있지만 전부는 아닙니다. 그들 중 몇 명은 어떤 것을 추측해야만했고, 그것은 효과가 없었습니다. 이전 코드에서 사용되지 않았다 내가 이전 코드가 long
에서 int32
또는 integer
로 변경되었다에서 복사 한 것과 변경 및 IntPtr
에 몇 가지 변경, 대부분의
long
에서
string()
으로 바뀌 었습니다. 다소 이상하게 보였으므로 제대로 컴파일되지 않았습니다.
그렇다면 DLL에서 함수 길이를 실제로 찾아보고 API와 어떻게 일치합니까?
Visual Studio의 c : \ windows \ system32 \ wininet.dll에 대한 참조를 Visual Studio의 VB.NET 프로젝트에 추가하려고하면 추가 할 수 없다는 메시지가 나타납니다. Visual Studio에서 개체 또는 어셈블리 브라우저를 사용할 수 없게됩니다. COM 개체로 나타나지 않습니다. 도움이 필요 하신가요?
Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (_
ByVal Agent As String, ByVal AccessType As Long, ByVal ProxyName As String, _
ByVal ProxyBypass As String, ByVal Flags As Long) As Long
Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (_
ByVal hInternetSession As Long, ByVal ServerName As String, ByVal ServerPort As Integer, ByVal UserName As String, _
ByVal Password As String, ByVal Service As Long, ByVal Flags As Long, ByVal Context As Long) As Long
Private Declare Function InternetCloseHandle Lib "wininet.dll" (_
ByVal hInet As Long) As Boolean
Private Declare Function InternetReadFile Lib "wininet.dll" (_
ByVal hConnect As Long, ByVal Buffer As String, ByVal NumberOfBytesToRead As Long, _
NumberOfBytesRead As Long) As Boolean
Private Declare Function HttpOpenRequest Lib "wininet.dll" Alias "HttpOpenRequestA" (_
ByVal hHttpSession As Long, ByVal Verb As String, ByVal ObjectName As String, ByVal Version As String, _
ByVal Referer As String, ByVal AcceptTypes As Long, ByVal Flags As Long, Context As Long) As Long
Private Declare Function HttpSendRequest Lib "wininet.dll" Alias "HttpSendRequestA" (_
ByVal hHttpRequest As Long, ByVal Headers As String, ByVal HeadersLength As Long, _
ByVal sOptional As String, ByVal OptionalLength As Long) As Boolean
이 기능에 대한 MSDN 선언과 비교. DWORD는 Integer이고 HINTERNET은 IntPtr입니다. 그리고 이것들을 철회하면 WebClient와 WebRequest를 사용해야합니다. –
@HansPassant 더 새로운 프레임 워크에서 이들을 다시 구현할 계획이지만 먼저 오래된 코드가 작동하도록하고 싶습니다. 너무 가깝습니다. 다른 어떤 것도 아니라면이 같은 문제를 더 잘 이해하고 배우십시오. ** MSDN 신고와 관련하여 ** ** 어디에서 찾을 수 있습니까? – LightCC
MSDN. 또는 Google의 첫 번째 히트 곡. –