VC++のEXEをDLLにしたい

解決


YANA  2005-03-04 03:47:45  No: 56588

いつも参考にさせていただいております。

現在、VC++で作ったアプリケーションをDLLにして、
別のアプリケーションに組み込んで、
そのアプリケーションから起動できるようにしたいのですが、
DLL用のプロジェクトを作成し、作成したアプリケーションのソースを
移管していけばいいと思うのですがどのようにすればいいのかわからない状態です。

すみませんがアドバイスいただけないでしょうか。
また自分でも調べておりますが、
参考になるHPや書籍をご存知でしたら教えていただけないでしょうか。


みけにゃん  2005-03-04 04:04:49  No: 56589

うーんよくわかりません。
DLLは普通、関数とかリソースだけ入れてるものなので
アプリケーションすべてを関数にするのは難しいと思います。


YANA  2005-03-04 04:39:08  No: 56590

アプリケーションをDLLにするのは厳しいのでしょうか・・・。

DLLにするのではなく、2つのEXE間でデータの送信は可能でしょうか?

と言うのも、ひとつはある機械を運転する為のアプリケーションで
もうひとつはデータ収集用のアプリケーションなのですが、
運転する為のアプリケーションからデータ収集開始の信号を
データ収集用のアプリケーションに送り収集開始をしたり
データ収集用アプリケーションで収集データのログ(csv)を作成する時に
運転する為のアプリケーションの設定データを一部書き込みなどをしたいのです。

csvファイルを作成する時に、データ量が多い為にファイル書き込み処理の部分で
データ収集用のアプリケーションが固まってしまいます。
データ収集用のアプリケーションは固まっても問題ないが、
運転用のアプリケーションは機械と通信している為、処理が固まってしまうと
問題になります。
そのため、運転する為のアプリケーションにデータ収集用のアプリケーションを
そのまま移植することが出来ません。

何か良い方法がありましたらアドバイスいただけないでしょうか。


岡田 之仁  2005-03-04 05:35:46  No: 56591

EXEをDLLにしたい・・・と言うことであれば、別段可能です。
ただ今回の件では、マルチスレッド化し、各々の機能を別々のスレッド
で動作するようにすれば、問題は無いと思いますが・・・

機械制御やデータ収集・解析処理は、私の本業とするところですので。
ただその方法が最終的に適しているのかどうかについては、プログラム
の規模や環境に左右されますので、これだけではなんとも言えません。

以上。


たく  2005-03-05 00:10:18  No: 56592

> DLLにするのではなく、2つのEXE間でデータの送信は可能でしょうか?
WM_COPYDATA


YANA  2005-03-07 18:49:36  No: 56593

まだ解決しておりませんが、参考書籍が見つかりましたので
マルチスレッドについて勉強し、処理の作成を行おうと思います。


YANA  2005-03-27 00:54:49  No: 56594

最終的には個々のアプリケーションをパイプで繋ぎ、
必要なデータを送受信することで自分が思っていた動作をすることが出来ました。

アドバイスいただきありがとうございました。

以下にパイプ作成の処理を記載しておきます。
********************************************************************
/*-------------------------------------------
 受信スレッド
-------------------------------------------*/
static UINT PipeSendRevice(HANDLE hPipe)
{
 LPTSTR lptszInBuffLocal = new TCHAR[1024];
 int nData = 0;
 char szWork[32];
 DWORD dwReaded;

 ReadFile(hPipe, lptszInBuffLocal, 1024, &dwReaded, NULL);

 strcpy(gCommunicationData.dReciveBuffData, lptszInBuffLocal);

 // 受信データの解析
 ::ZeroMemory(szWork, sizeof(szWork));
 ::CopyMemory(&szWork, &gCommunicationData.dReciveBuffData[nData], 1);
 sscanf(szWork, _T("%d"), &gCommunicationData.dHealthSignal);

 FlushFileBuffers(hPipe);
 DisconnectNamedPipe(hPipe);
 CloseHandle(hPipe);
 delete lptszInBuffLocal;

 return 0;
}

/*-------------------------------------------
 名前付きパイプサーバーメインスレッド
-------------------------------------------*/
static UINT PipeServer(LPVOID lpvParam)
{
 HANDLE hPipe;
 OVERLAPPED ol;
 HANDLE hEvents[2];

 DWORD dwOpenMode = FILE_FLAG_OVERLAPPED | PIPE_ACCESS_DUPLEX;
 DWORD dwPipeMode = PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT;

 if((hEvents[1] = CreateEvent(NULL, TRUE, FALSE, NULL)) == NULL)
 {
  return GetLastError();
 }
 hEvents[0] = hEvents[1];

 while(TRUE)
 {
  hPipe = CreateNamedPipe(TEXT("\\\\.\\pipe\\ANALOG_UNIPULX_PIPE"),
    dwOpenMode, dwPipeMode, PIPE_UNLIMITED_INSTANCES,
    0, 0, NMPWAIT_USE_DEFAULT_WAIT, NULL);

  if(hPipe == INVALID_HANDLE_VALUE)
  {
  return GetLastError();
  }

  ZeroMemory(&ol, sizeof(OVERLAPPED));
  ol.hEvent = hEvents[1];
  ResetEvent(ol.hEvent);

  // パイプの接続
  ConnectNamedPipe(hPipe, &ol);

  // データ受信まで待機
  WaitForMultipleObjects(2, hEvents, FALSE, INFINITE);

  // 受信データの解析
  AfxBeginThread(PipeSendRevice, (LPVOID)hPipe, THREAD_PRIORITY_IDLE);
 }

 CloseHandle(hPipe);
 CloseHandle(hEvents[1]);
 return TRUE;
}

/*-------------------------------------------
 名前付きパイプサーバーメインスレッド
-------------------------------------------*/
BOOL CMainFrame::ComunicationMain()
{
 LRESULT lResult = ERROR_SUCCESS;

 HANDLE hThread = AfxBeginThread(PipeServer, NULL, THREAD_PRIORITY_IDLE);

 if(hThread == INVALID_HANDLE_VALUE)
 {
  lResult = GetLastError();
  return (int)lResult;
 }

 DWORD dwExitCode = ERROR_SUCCESS;
 do
 {
  Sleep(500);
  GetExitCodeThread(hThread, &dwExitCode);
 }while(dwExitCode == STILL_ACTIVE);

 return (int)lResult;
}


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加