0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DLLを他のプログラムで使う際にエラーが出て、そこから解決に至るまで

Posted at

開発環境

Visual Studio Community 2019

前置き

昔UnityのC#を使っていた際、C#の知識をチームに教えるより、経験あるC++で作成したDLLを作っていたことがあります。

当時書いたDLLに関する記事はこちら。

Unity(C#)でC++で作成されたDLLを使用する基本的な方法

そして現在、大学の研究室でC#を利用する機会を頂き、同じようなソースコードでDLLを実装したのですが、何故かエラーが出てくる状態に…。

それを解決するまでの経緯を記事にしておきます。

経緯

DLLをダンブして関数が機能しているか確認する

上記記事のように、超単純なDLLでテストしても「DLLはあっても関数が存在しない」例外が出て、もしかしたら関数名がおかしいのでは?と思って、バイナリファイルをダンプして関数があるか調べました。

こちらの記事を参考にして、

  1. Visual Studioの「ツール」->「コマンドライン」->「開発者用PowerShell」を選択
  2. 以下のようにコマンドを入力
dumpbin /exports Debug\example.dll > output.txt

こうすることで、Visual Studio内でデバッグ出力したDLLの関数の詳細がslnファイルがあるフォルダに生成されます。

生成されたテキストファイルを見てみると、関数がよくわからない名前になっていました。

__stdcallがついてるか確認する

恐らくコンパイルしたときに何かの手違いで変な名前にされた可能性があると思い、他のDLLに関するソースコードを漁って比較しました。

そうすると、多くのソースコードに呼び出し規約である

__stdcall

を、関数を宣言する際に使われていました。そこで、

dllamin.cpp
extern "C"
{
    __declspec(dllexport) void __stdcall example()
}

void __stdcall example()
{
    ...
}

のようにすることで、C#側でしっかり利用できるようになりました。

まとめ

今回学んだことは以下の2つです。

  • DLLのエラー困ったらdumpbinで確認する

  • 呼び出し規約「__stdcall」をつける

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?