VC++ 编写的DLL代码如下#include <windows.h>
#include <wininet.h>
#include <malloc.h>LPSTR GetInternetURLText(IN LPSTR szUrl)
{
typedef BOOL (WINAPI *FN_INTERNETCLOSEHANDLE)(HINTERNET);
typedef HINTERNET (WINAPI *FN_INTERNETOPENA)(LPCSTR, DWORD, LPCSTR, LPCSTR, DWORD);
typedef HINTERNET (WINAPI *FN_INTERNETOPENURLA)(HINTERNET, LPCSTR, LPCSTR, DWORD, DWORD, DWORD);
typedef BOOL (WINAPI *FN_INTERNETREADFILE)(HINTERNET, LPVOID, DWORD, LPDWORD);

static FN_INTERNETCLOSEHANDLE pfnInternetCloseHandle = NULL;
static FN_INTERNETOPENA pfnInternetOpenA = NULL;
static FN_INTERNETOPENURLA  pfnInternetOpenUrlA = NULL;
static FN_INTERNETREADFILE pfnInternetReadFile = NULL;

if (pfnInternetCloseHandle == NULL || pfnInternetOpenA == NULL || pfnInternetOpenUrlA == NULL || pfnInternetReadFile == NULL)
{
int __nWininetDLL[] = {'iniw', '.ten', 'lld', 0}; // "wininet.dll"
char *__szWininetDLL = (char *)__nWininetDLL;

int __nInternetCloseHandle[] = {'etnI', 'tenr', 'solC', 'naHe', 'eld', 0};
char *__szInternetCloseHandle = (char *)__nInternetCloseHandle;
int __nInternetOpenA[] = {'etnI', 'tenr', 'nepO', 'A', 0};
char *__szInternetOpenA = (char *)__nInternetOpenA;
int __nInternetOpenUrlA[] = {'etnI', 'tenr', 'nepO', 'AlrU', 0};
char *__szInternetOpenUrlA = (char *)__nInternetOpenUrlA;
int __nInternetReadFile[] = {'etnI', 'tenr', 'daeR', 'eliF', 0};
char *__szInternetReadFile = (char *)__nInternetReadFile;

HMODULE hDll = LoadLibrary(__szWininetDLL);
pfnInternetCloseHandle = (FN_INTERNETCLOSEHANDLE)GetProcAddress(hDll, __szInternetCloseHandle);
pfnInternetOpenA = (FN_INTERNETOPENA)GetProcAddress(hDll, __szInternetOpenA);
pfnInternetOpenUrlA = (FN_INTERNETOPENURLA)GetProcAddress(hDll, __szInternetOpenUrlA);
pfnInternetReadFile = (FN_INTERNETREADFILE)GetProcAddress(hDll, __szInternetReadFile);
}

HINTERNET hSession, hRequest;
LPSTR lpResult;
BOOL bRet = FALSE;
DWORD dwTotalSize = 512;
DWORD dwBytesRead = 0;
DWORD dwCurrent = 0;
char buf[512];

hSession = pfnInternetOpenA(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (hSession != NULL)
{
hRequest = pfnInternetOpenUrlA(hSession, szUrl, NULL, 0, INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE, 0);
if (hRequest != NULL)
{
lpResult = (LPSTR)malloc(512);
bRet = pfnInternetReadFile(hRequest, buf, 512, &dwBytesRead);
while (bRet && dwBytesRead > 0)
{
if (dwCurrent + dwBytesRead > dwTotalSize)
{
dwTotalSize += 512;
LPSTR p = (LPSTR)realloc(lpResult, dwTotalSize);
if (p)
lpResult = p;
else
break;
}
memcpy(lpResult + dwCurrent, buf, dwBytesRead);
dwCurrent += dwBytesRead;
bRet = pfnInternetReadFile(hRequest, buf, 512, &dwBytesRead);
}
if (dwCurrent <= 0)
free(lpResult);
else
lpResult[dwCurrent] = 0;
}
pfnInternetCloseHandle(hRequest);
}

pfnInternetCloseHandle(hSession);
return dwCurrent > 0 ? lpResult : NULL;
}我在C#中调用 代码如下        //引用获取网页源文件Dll
        [DllImport("httpget.dll")]
        //申明一个获取网页源文件的函数-有返回类型-参数是-网页连接
        public static extern string GetInternetURLText(string YuanWenJian);运行一段时间后出现 尝试读取或写入受保护的内存。这通常指示其他内存已损坏我知道好象是VC++写的DLL没有free 造成的内存泄露问题但是怎么解决呢?如何在C#中释放呢?请大哥大姐帮我。。给了全套列子。。代码

解决方案 »

  1.   

    c# 的string  对应  C++  的 char *  ;
    LPSTR  是什么类型?
      

  2.   

    lpResult = (LPSTR)malloc(512); 
    你这个有点问题,在dll内malloc内存,谁来释放?
      

  3.   

    在dll返回dll内部malloc new 指针非常容易出错
      

  4.   

    试试:
            [DllImport("httpget.dll",CharSet=CharSet.Ansi)]
            public static extern string GetInternetURLText(string YuanWenJian);
    如果不行,用:
            [DllImport("httpget.dll",CharSet=CharSet.Ansi)]
            public static extern string GetInternetURLText(ref string YuanWenJian);