ちょっと変わったマニアな作品が集結

C#からCで作成したDLLにステップインできません。

対策としては以下を行いましたが、ステップインできませんでした。他の対策を知っていたら教えてください!

環境:C#, CともにVS2008, Windows XP professional

・プロジェクトのプロパティのデバッグタブで、「アンマネージのデバッグを~」にチェックを入れる。
・完全なソースを必要とするのチェックをはずす。
・C#のexeと同一DIRにdllと、pdbファイルを配置する。
・全てデバッグでコンパイルする。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

C関数がエクスポートされているDLL側がWin32であれば、C#側の「プラットフォーム ターゲット」をx86にして、DLL側がx64であれば、C#側もx64にしてみるとか。

デフォルトではAny CPUになっているはず。

せめてDLL側の関数宣言部やEXE側の呼び出しコード(P/Invoke)をそれぞれ部分的にでも書いておかないと、類推するのは難しいです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。偶然にも自己解決いたしました。
今までは、アプリケーションを起動した後に、IDEでもってアタッチする。という
方法をとっていたのですが、これでは対象のモジュール(dll)がまだロードされて
いない状態でした。
F5でデバッグ実行をすると、今までステップインできなかったモジュールが最初に
ロードされて、ステップインもできるようになりました。
お手数をおかけしましたm(。。)m

お礼日時:2011/03/23 19:10

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QC#で、C言語で作ったdllに文字列の参照渡し

Cで
int test(char* moji) {
  moji = "test";
  return 0;
}
のようなdllを作り、C#側から
  test(ref cs_moji);
としても変数cs_mojiに"test"という文字列は帰ってきませんでした。
数時間調べたりしてcs_mojiの型をstringやStringBuilder等としたのですが、どれもうまくいきませんでした。
ポインタのポインタを利用したときは文字列は帰ってきたものの文字化けがたくさんしていて理想とはかけ離れていました。
どのようにしたらCのdllからC#に文字列を送ることができるでしょうか。
初歩的な質問かもしれないですがよろしくお願いいたします。

Aベストアンサー

マネージドコードとアンマネージドコード間でのデータのやりとりになるので初歩的ではないです。

ひとまずこの辺は読んでおくべきかと思います。
http://msdn.microsoft.com/ja-jp/library/26thfadc%28v=vs.80%29.aspx
http://msdn.microsoft.com/ja-jp/library/e8w969hb%28v=vs.80%29.aspx

QC#で構造体の配列を持った構造体を使いたいのですが

C#で構造体の配列を持った構造体を使いたいのですが
Cならば
struct xyz {
struct abc _abc[32];
int index;
};
struct abc {
int a;
int b;
int c;
};

struct xyz _xyz[8];
xyz[0]._abc[3].b = 1;

のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません
うまくやる方法をどなたかご存知ないでしょうか

Visual Studio 2005行った場合
コンパイルで
構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するには、次元指定子を変数の識別子の前に指定します。固定サイズ バッファ フィールドを宣言するには、フィールド型の前に fixed キーワードを使用します
となり

fixed をつけると

固定サイズ バッファの型は次のうちの 1 つでなければなりません: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float または double

となってしまいます

C#で構造体の配列を持った構造体を使いたいのですが
Cならば
struct xyz {
struct abc _abc[32];
int index;
};
struct abc {
int a;
int b;
int c;
};

struct xyz _xyz[8];
xyz[0]._abc[3].b = 1;

のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません
うまくやる方法をどなたかご存知ないでしょうか

Visual Studio 2005行った場合
コンパイルで
構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するに...続きを読む

Aベストアンサー

C# では、配列は「単なる連続したメモリ領域」ではなくて「添字によってオブジェクトを格納できるオブジェクト」であることに注意しなくてはいけません。つまり、C では配列は一種の構造体でしたが、C# では配列は参照型のオブジェクトです。
よって、C のように予めサイズを固定しておくということは基本的にできません。配列の大きさは配列のインスタンスが作られるときに動的に決まります。

C# では、参照型のオブジェクトを構造体のメンバにすることはあまりありません。null 値の扱いが面倒だからです。
また、C# では構造体の大きさは大きくとも 20 バイト程度までにします。C# では基本的に「構造体へのポインタ」はありません。巨大な構造体をそのまま扱うのはメモリの使い方の観点からいって非効率的です。

今回の件では、構造体ではなくクラスにするのがよいかと思われます。

Qsleep()関数について

"数秒おきに警報をn回鳴らすプログラム"をC言語で作成しようと
考えています。

プログラム実行環境はWindowsですが、
sleep()関数は使用できないのでしょうか??

仮に使用できない場合、この関数に代わる関数や代替方法が
あれば教えて頂けませんでしょうか? 宜しくお願いします。

Aベストアンサー

正確な動作でも構わなければ
windows.hをインクルードして
Sleep()関数を使いましょう.
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200207/02070061.txt

しかし,正確に数秒おきに動作を行いたい場合はマルチメディアタイマ等を使いましょう.
マルチメディアタイマはミリ秒間隔でコールバック関数を呼び出すことができます.
timeSetEventを用いてコールバック関数の登録を行うことができます.
timeKillEventでコールバック関数の解除を行うことができます.

多分他にも方法があると思うのですが…私はこれぐらいしか知りません^^;

参考URL:http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/time.html

QVC++でDLL、エントリポイントが出来ない?

VisualStudio2010 VC++でDLLを作成し既存のDelphiXE2アプリで利用したいのですが
MSのサンプルソースそのままでDLLを作成しても、__stdcall;しても、Delphiの読み込み時に
「エントリポイントが見つかりません」と言われます。

http://msdn.microsoft.com/ja-jp/library/ms235636.aspx
ソースはMSのチュートリアルそのままです。

ためしに VS2010のツール dumpbin.exe /exports ????.dll と中身を覗くと
1 0 ooo11104 ?Add@MyMathFuncs@MathFuncs@@SGNNN@Z
2 1 ,,,,,,,,,,,,,,

のような表示とSummary 以下しか表示されずスタティックライブラリにしても中身は同じです。
それでは、と他のDLLをいくつか覗いてみましたが、大概のDLLやLIBファイルを覗くと
すっきりしたきれいな関数名の一覧がdumpbin /exports で表示されます。

では、DLLになっていないのかというと、作ったDLLを同じVC++でチュートリアル通りに
呼び出すと何の問題もなく使えますので、多分正常なのでしょう。 しかし、どうして
エントリポイントの一覧が見える形にならないのか分かりません。多言語で利用するには
必要かと思います。

VC++で作成したDLLやLibが他の環境で使えないとは考えられないので、なにか、常識的な
部分を知らないのだと思いますが、どなたかよろしくお願いします。

VisualStudio2010 VC++でDLLを作成し既存のDelphiXE2アプリで利用したいのですが
MSのサンプルソースそのままでDLLを作成しても、__stdcall;しても、Delphiの読み込み時に
「エントリポイントが見つかりません」と言われます。

http://msdn.microsoft.com/ja-jp/library/ms235636.aspx
ソースはMSのチュートリアルそのままです。

ためしに VS2010のツール dumpbin.exe /exports ????.dll と中身を覗くと
1 0 ooo11104 ?Add@MyMathFuncs@MathFuncs@@SGNNN@Z
2 1 ,,,,,,,,,,,,,,

のような表示とSummary ...続きを読む

Aベストアンサー

「DLL エクスポート DEFファイル」あたりで検索して下さい。
http://elksimple.web.fc2.com/memo/dll.html
とか見つかるかと思いますが……。

戻り値や引数の型、数によってdllexportでエクスポートした場合の名前が変わります。
dllimportならば、同じ形式でエクスポート名を生成しますから問題は出ないのですが……
他の環境で使う場合には使いにくいものになります。
extern "C"
とすることで、命名規則が微妙に変わりますが…やはり使いやすいものにはなりません。
defファイルで指定する方法ならば名前は固定化できます。
# ただし、この方法ではクラスは使えない…でしょう。

あと…
[技術者向] コンピューター > プログラミング > C・C++
のカテゴリの方がよろしいかと……。
# まぁ、使うりがDelphiでも、DLL作成はVCのようですし。

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

QC# DLL エントリ ポイントが見つかりません。

C#で作成したDLLをC#から呼出したいのですが、うまくいきません。

// トリガ
private void button2_Click(object sender, EventArgs e)
{
string ans = DLL.moji();
MessageBox.Show(ans);
}

// DLL呼出し用クラス
class DLL
{
[DllImport("LibCsharp.dll")]
public static extern string moji();
}

// DLL(LibCsharp.dll内容)
class AddClass
{
public static string moji()
{
return ("テスト");
}
}

上記で実行すると「EntryPointNotFoundException DLL 'LibCsharp.dll' の 'moji' というエントリ ポイントが見つかりません。」となります。

プロジェクトの参照設定にはLibCsharpを追加しています。
Web上で調べたのですが、解決には至っておりません。

申し訳ありませんが、よろしくお願いします。

C#で作成したDLLをC#から呼出したいのですが、うまくいきません。

// トリガ
private void button2_Click(object sender, EventArgs e)
{
string ans = DLL.moji();
MessageBox.Show(ans);
}

// DLL呼出し用クラス
class DLL
{
[DllImport("LibCsharp.dll")]
public static extern string moji();
}

// DLL(LibCsharp.dll内容)
class AddClass
{
public static string moji()
{
...続きを読む

Aベストアンサー

#1です。

私もc#で簡易な独自ライブラリを構築しようとしていたので調べてみました。
結果として参照の追加でdllを直接、指定するだけで使用可能だと分かりました。
(「参照設定」右クリック→「参照の追加」→「参照」タブ選択→DLLを選択)


まず基本的な知識としてdllには3種類あると覚えて下さい。

・レガシー(古い遺産)dll
・active-x dll
・.net dll


私はレガシーdll時代の知識しかありませんでした。
この頃のdllを使用するためには、dll本体以外に以下のファイルが必要でした。

・ヘッダファイル
・ライブラリ(lib)ファイル
・defファイル(場合による)


c#で作られたdllは[.net dll]となり、[.net freamwork]上で動作する各種の言語で使用出来るようにするため、煩わしいlibファイルやヘッダファイル等を削除する方向でdllが進化しているのだと思われます。

ネット検索をしていて見つけたのですが、[.net dll]で作成されたFTPクライアントのライブラリがありました。
(.NET用FTPクラスライブラリ (TKFP.DLL) )

どの言語で作られているのか分かりませんが、[.net dll]で作られているため、c#およびvbで使用可能のようです。
追加したdll内に含まれているクラスや関数に対してオブジェクトブラウザで概要が表示出来るようにXMLファイルで概要を記述出来るようなのですが、詳細まで調べることが出来ませんでした。
(申し訳ありません。)

#1です。

私もc#で簡易な独自ライブラリを構築しようとしていたので調べてみました。
結果として参照の追加でdllを直接、指定するだけで使用可能だと分かりました。
(「参照設定」右クリック→「参照の追加」→「参照」タブ選択→DLLを選択)


まず基本的な知識としてdllには3種類あると覚えて下さい。

・レガシー(古い遺産)dll
・active-x dll
・.net dll


私はレガシーdll時代の知識しかありませんでした。
この頃のdllを使用するためには、dll本体以外に以下のファイルが必要でした。

・...続きを読む

Qフルパスから最後のディレクトリ名を取得したい。

vb.netなのですが、例えば
c:\aaa\bbb\ccc\ddd\eee\fff.exe
というフルパスがあったとして、
eeeというディレクトリ名を取得したいのですが、
何か良い方法はないでしょうか。
それぞれのディレクトリ名の文字数や階層数は
決まっていないのですが、オススメの方法が
ありましたら、教えて頂けると助かります。

Aベストアンサー

MessageBox.Show(IO.Path.GetFileName(IO.Path.GetDirectoryName(myPath)))

IO.Path の GetDirectoryName でフォルダのフルパスを取得して、さらに IO.Path の GetFileName で最終フォルダ(またはファイル)の名前を取得。

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QC++からC#のdllを参照する際、引数内に構造体があった場合の処理

いつもお世話になっております。

http://satoshi.web5.jp/memo/connect_dll.htm

VC++2008のMFCプロジェクトにて、C#のdllの関数を扱いたく、
上記サイトを参考に実装してみました。

上記サイトでも挙げているように、C#dll内の関数の引数が、
整数・文字列の場合は、うまく動作するのですが、
引数に構造体を渡し、dllにて構造体のデータを設定してやる関数にて、
引数の構造体ポインタを、どのように渡してやれば良いのかが
分かりません。

具体的には、
VARIANTARGの配列をnewし(変数pVarg)、
pVargに型と変数をセットして、Invoke関数に渡しますが、
その際の、pVargにセットしてやる型が分かりません。

このような場合は、どうすれば良いのでしょう?
よろしくお願いします。

Aベストアンサー

 こんばんは。補足頂きました。

[StructLayout(LayoutKind.Sequential)]
public struct ADUser
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string account;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string name;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string mail;
}

 ではないでしょうか。念の為にもう一度掲載します。

//C#サイド
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;

namespace ClassLibrary1
{
[ClassInterface(ClassInterfaceType.AutoDual)]
public class Class1
{
[StructLayout(LayoutKind.Sequential)]
public struct ADUser
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string account;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string name;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string mail;
}

[MethodImpl(MethodImplOptions.Synchronized)]
public int fun(int intPtr)
{
System.IntPtr ptr = new System.IntPtr(intPtr);
ADUser test = (ADUser)Marshal.PtrToStructure(ptr, typeof(ADUser));
test.account = "123-456-7890";
test.name = "c++ to c# struct pointer";
test.mail = "xxx@abc.def.jp";
Marshal.StructureToPtr(test, ptr, true);
return 0;
}
}
}

//C++サイド
typedef struct ADUSER{
char account[100];
char name[100];
char mail[100];
}ADUser;

int main()
{
::CoInitialize( NULL );

CLSID clsid;
BSTR bstrDLL = _com_util::ConvertStringToBSTR( "ClassLibrary1.Class1" );
HRESULT hResult = ::CLSIDFromProgID(bstrDLL, &clsid);
if(!SUCCEEDED(hResult))
return 0;

IUnknown* pUnk = NULL;
hResult = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pUnk);
if(!SUCCEEDED(hResult))
return 0;

IDispatch* pDisp = NULL;
hResult = pUnk->QueryInterface( IID_IDispatch, (void**)&pDisp );
if(!SUCCEEDED(hResult))
return 0;

DISPID dispid = 0;
LPOLESTR fun = L"fun";
hResult = pDisp->GetIDsOfNames(IID_NULL, &fun, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
if(!SUCCEEDED(hResult))
return 0;

ADUser test = {0};
DISPPARAMS params = {0};

params.cArgs = 1;
params.cNamedArgs = 0;
params.rgdispidNamedArgs = NULL;

VARIANTARG* pVarg = new VARIANTARG[params.cArgs];
::ZeroMemory(pVarg, sizeof(VARIANTARG) * params.cArgs);

pVarg[0].vt = VT_INT;
pVarg[0].intVal = (int)&test;

params.rgvarg = pVarg;

hResult = pDisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &params, NULL, NULL, NULL);

::printf("[account : %s][name : %s][mail : %s]\n", test.account, test.name, test.mail);

::CoUninitialize();
::SysFreeString(bstrDLL);
delete []pVarg;

return 0;
}

 こんばんは。補足頂きました。

[StructLayout(LayoutKind.Sequential)]
public struct ADUser
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string account;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string name;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string mail;
}

 ではないでしょうか。念の為にもう一度...続きを読む


人気Q&Aランキング