Существует простая программа для выполнения http запросов и получения ответов. Программа работает как положено:
#include <stdio.h>
#include <curl/curl.h>
#pragma comment(lib,"curllib.lib")
int main(int argc, char *argv[])
{
CURL *curl_handle;
CURLcode res;
curl_handle = curl_easy_init();
if(curl_handle)
{
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.google.com");
res = curl_easy_perform(curl_handle);
curl_easy_cleanup(curl_handle);
}
getchar();
return 0;
}
После запуска программы я получаю код главной страницы Google в консоли.
Я перестроил программу в DLL.
#include <stdio.h>
#include <curl/curl.h>
#pragma comment(lib,"curllib.lib")
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
CURL *curl_handle;
CURLcode res;
curl_handle = curl_easy_init();
if(curl_handle)
{
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.google.com");
printf("point 1");
res = curl_easy_perform(curl_handle); //Program hang
printf("point 2");
curl_easy_cleanup(curl_handle);
}
getchar();
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
На экране отображается «точка 1», после чего программа зависает навсегда.
Для загрузки библиотеки используйте следующий код:
#include "stdafx.h"#include <iostream>
#include <windows.h>
using namespace std;
typedef unsigned __int64 ulong64;
typedef int (*ph_dct_imagehash)(const char* file,ulong64 &hash);
int _tmain(int argc, _TCHAR* argv[])
{
ph_dct_imagehash _ph_dct_imagehash;
HINSTANCE hInstLibrary = LoadLibrary(L"dlltest.dll");
if (hInstLibrary)
{
std::cout << "Ok!" << std::endl;FreeLibrary(hInstLibrary);
}
else
{
std::cout << "DLL Failed To Load!" << std::endl;
std::cout << GetLastError() << std::endl;
}
std::cin.get();
return 0;
}
Exe-файл проекта для запуска dll http://rghost.ru/46766786 (для vc2010) просто нажмите кнопку «скачать» проекта dll http://rghost.ru/46766821 (для vc2010)
Как я могу заставить программу не зависать?
Задача ещё не решена.
Других решений пока нет …