C++で自作DLL内から同じディレクトリにあるDLLを呼ぶには?
C#内からC++の自作DLLにダウンロードURLを送り、
ダウンロード完了後、中身のtarファイルを展開するために
動的にTAR32.DLLを読み込んだところdownLoadTestに
Falseが返ってきました。
C++側のみをDLL化せずMFCでテストした時には
testretにTrueが返ってきていてDLLがロードできた事が
確認できたのですが、DLL内から呼んだ時には
DLLのロードに失敗しているようでFalseになります。
同じディレクトリに2つのDLLを置くのではなく、
参照先のようなものを持つ必要があるのでしょうか?
使用しているTar32.DLLは下記から取得しました。
http://www.csdinc.co.jp/archiver/lib/tar32.html
[追記]
フォルダ構成
Assets
|---------Plaugins
| |------CallDll.cs
| |------DllHttpDownLoadUntar.dll
| |------tar32.dll
|
|
|---------Scripts
開発環境
・Windoes7 64bit
・Visual Studio Community 2013
C#側
CallDll.cs
[DllImport("DllHttpDownLoadUntar")]
private static extern bool HttpDwonLoad(string geturl);
public void AddUrl()
{
bool downLoadTest = false;
downLoadTest = HttpDwonLoad("http://IPアドレス/Tar/Android.tar");
}
C++DLL側
DllHttpDownLoadUntar.h
#ifdef DLLHTTPDOWNLOADUNTAR_EXPORTS
#define DLLHTTPDOWNLOADUNTAR_API __declspec(dllexport)
#else
#define DLLHTTPDOWNLOADUNTAR_API __declspec(dllimport)
#endif
#include <string>
typedef int (WINAPI *LPUNTAREXTRACTMEM)(const HWND, LPCSTR, LPBYTE, const DWORD, int *, LPWORD, LPDWORD);
LPUNTAREXTRACTMEM lpTarExtractMem = NULL;
HMODULE hTar32 = 0;
extern "C"{
DLLHTTPDOWNLOADUNTAR_API bool HttpDwonLoad(char* geturl);
DLLHTTPDOWNLOADUNTAR_API void HttpDownLoadAction(std::string url);
}
DllHttpDownLoadUntar.cpp
#include "stdafx.h"
#include "DllHttpDownLoadUntar.h"
#include "wininet.h"
extern "C"{
// 受け取ったURLのダウンロード
bool HttpDwonLoad(char* geturl){
HttpDownLoadAction(geturl);
std::string DllName = "TAR32.DLL";
size_t origsize = DllName.size() + 1;
const size_t newsize = 100;
size_t convertedChars = 0;
wchar_t wcstring[newsize];
mbstowcs_s(&convertedChars, wcstring, origsize, DllName.c_str(), _TRUNCATE);
bool testret = true;
hTar32 = LoadLibrary(wcstring);
if (!hTar32) {
testret = false;
}
else
{
lpTarExtractMem = (LPUNTAREXTRACTMEM)GetProcAddress(hTar32, "TarExtractMem");
}
return testret;
}
void HttpDownLoadAction(std::string url){
HINTERNET hInet, hUrl;
char szBuf[128], *lpszSrc;
DWORD dwRead, dwTotal = 0; // ファイルサイズ
HGLOBAL hMem;
//URLの入力
//m_edit_url.GetWindowTextA(ss);
char szUrl[128];
strcpy_s(szUrl, url.c_str());
//インターネットの開始
hInet = InternetOpen((LPCWSTR)"test-program",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL, NULL, 0);
if (hInet == NULL){
return;
}
size_t origsize = url.size() + 1;
const size_t newsize = 100;
size_t convertedChars = 0;
wchar_t wcstring[newsize];
mbstowcs_s(&convertedChars, wcstring, origsize, szUrl, _TRUNCATE);
//HTTPセッションの開始、指定のURLオープン
hUrl = InternetOpenUrl(hInet, wcstring, NULL, 0, 0, 0);
if (hUrl == NULL){
return;
}
hMem = GlobalAlloc(GHND, 1);
lpszSrc = (char*)GlobalLock(hMem);
while (1){
InternetReadFile(
hUrl, szBuf, (DWORD)sizeof(szBuf) - 1, &dwRead);
szBuf[dwRead] = '\0';
if (dwRead == 0)break;
dwTotal += dwRead;
hMem = GlobalReAlloc(hMem, dwTotal + 1, GMEM_MOVEABLE);
if (hMem == NULL){
return;
}
lpszSrc = (char*)GlobalLock(hMem);
if (lpszSrc == NULL){
break;
}
strcat_s(lpszSrc, dwTotal + 1, szBuf);
}
//メモリの解放
GlobalUnlock(hMem);
GlobalFree(hMem);
//インターネットハンドルの解放
InternetCloseHandle(hUrl);
InternetCloseHandle(hInet);
}
}